Прокрутите объект JSON и верните ключ на основе указанного значения

После получения результатов от моего вызова api с почтальоном я пытался получить соответствующий идентификатор значения «KC Content Kind ID» в моей функции успеха ниже, но, поскольку это не массив, мне было интересно, будет ли каждый работать в jquery и как иди об этом. Я хочу пройти через этот вложенный объект json, перейдя к объекту фасета и сказать, если атрибут name равен «KC Content Kind ID», а затем вернуть идентификатор для этого соответствующего атрибута имени.

    "results": {
       "data": {
          "facets": {
              "60749428": {
                "id": 60749428,
                "name": "KC Content Content Kind"
              },
              "60750276": {
                "id": 60750276,
                "name": "KC Content Product Version"
              },
              "69107204": {
               "id": 69107204,
               "name": "KC Video Audience"
              },
              "69127027": {
               "id": 69127027,
               "name": "KC Content Kind ID"
             }
          }
       }
    }

Это мой код, и я имею в виду функцию успеха.

function getAvailableKinds() {
$.ajax({
    url: csexe + "/api/v2/facets/" +getLocationId(),
    dataType: "json",
    type: "GET",
    beforeSend: function(xhr) {
        xhr.setRequestHeader ("OTCSticket", getAuthToken());
    },
    success: function(response) {
        var obj = response.results.data.facets;
        $.each(obj, function(item, value){
             if ( value.name == 'KC Content Kind ID') {
                 var idRequired = obj.id;
             }
        });
    },
    error: function(jqXHR, textStatus, errorThrown){
        alert("An error occurred... Look at the console");
        $("body").html('<p>status code: '+jqXHR.status+'</p><p>Error Thrown: ' + errorThrown + '</p><p>Response Text:</p><div>'+jqXHR.responseText + '</div>');
    }
});

Итак, вы хотите, чтобы последнее слово, что бы оно ни было, было искомым свойством для объекта, имя которого совпадает с остальным текстом?

zfrisch 29.11.2018 18:46

Итак, я хотел бы сказать, если получить 'id' атрибутов 'name', который соответствует 'KC Content Kind ID' в этом объекте результата

Tope 29.11.2018 18:48

Проблема в том, что ваши данные плохо структурированы. Фасеты должны быть массивом объектов, а не объектом с пронумерованными свойствами. Затем вы можете просто использовать методы массива для поиска правильных данных. Как бы то ни было, вам нужно будет преобразовать эти данные в массив, прежде чем выполнять какие-либо операции с ним, т.е. добавлять по одному шагу для каждой операции.

James 29.11.2018 19:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
411
4

Ответы 4

Вы можете использовать Object.keys(), а затем filter результаты, основанные на вашем тесте. Например:

let results = {"data": {"facets": {"60749428": {"id": 60749428,"name": "KC Content Content Kind"},"60750276": {"id": 60750276,"name": "KC Content Product Version"},"69107204": {"id": 69107204,"name": "KC Video Audience"},"69127027": {"id": 69127027,"name": "KC Content Kind ID"}}}}

let obj = results.data.facets;
let k = Object.keys(obj).filter(key => obj[key].name === "KC Content Kind ID")

// an array of all matches
console.info(k)

Если вы знаете, что будет только один, find() найдет первое совпадение:

let results = {"data": {"facets": {"60749428": {"id": 60749428,"name": "KC Content Content Kind"},"60750276": {"id": 60750276,"name": "KC Content Product Version"},"69107204": {"id": 69107204,"name": "KC Video Audience"},"69127027": {"id": 69127027,"name": "KC Content Kind ID"}}}}

let obj = results.data.facets;
let k = Object.keys(obj).find(key => obj[key].name === "KC Content Kind ID")

// the first match
console.info(k)

Вы получаете идентификатор с Object.entries и find, если знаете, что идентификатор уникален, поскольку Array.find остановится при первом совпадении. Это также вернет идентификатор, а также содержимое объекта.

const d = { "data": { "facets": { "60749428": { "id": 60749428, "name": "KC Content Content Kind" }, "60750276": { "id": 60750276, "name": "KC Content Product Version" }, "69107204": { "id": 69107204, "name": "KC Video Audience" }, "69127027": { "id": 69127027, "name": "KC Content Kind ID" } } } }

const r = Object.entries(d.data.facets).find(([k,v]) => v.name == "KC Content Kind ID")
console.info(r ? r[0] : undefined)

Если вы вернете r[1], вы получите объект с этим ключом. r[0] возвращает только ваш совпадающий идентификатор.

Вы можете перебрать объект фасетов и определить, указывает ли последнее слово на отдельное свойство, отличное от name. Если это так, мы возвращаем это свойство, если нет, мы возвращаем name

Object.values(obj).map(o => {
  let prop = o.name.split(" ").pop().toLowerCase();
  return (prop in o) ? o[prop] : o.name;
});

let apiResult = {
  "results": {
    "data": {
      "facets": {
        "60749428": {
          "id": 60749428,
          "name": "KC Content Content Kind"
        },
        "60750276": {
          "id": 60750276,
          "name": "KC Content Product Version"
        },
        "69107204": {
          "id": 69107204,
          "name": "KC Video Audience"
        },
        "69127027": {
          "id": 69127027,
          "name": "KC Content Kind ID"
        }
      }
    }
  }
};

const loop = (obj) => Object.values(obj).map(o => {
    let prop = o.name.split(" ").pop().toLowerCase();
    return (prop in o) ? o[prop] : o.name;
  });
  
console.info(loop(apiResult.results.data.facets));

Если вы собираетесь выполнять эту операцию много раз, вам может показаться, что реструктуризация данных в массив проще в использовании.

const results = {"data":{"facets":{"60749428":{"id":60749428,"name":"KC Content Content Kind"},"60750276":{"id":60750276,"name":"KC Content Product Version"},"69107204":{"id":69107204,"name":"KC Video Audience"},"69127027":{"id":69127027,"name":"KC Content Kind ID"}}}};

// Get a list of the facet keys
const keys = Object.keys(results.data.facets);

// Pull those facet objects into an array
const arr = keys.reduce((acc, key) => acc.concat(results.data.facets[key]), []);
  
// Find the object that matches the required name, and return the id
const id = arr.find(el => el.name === 'KC Content Kind ID').id;
console.info(id);

Используя этот массив, вы можете написать общую функцию для сбора информации:

const arr = [{"id":60749428,"name":"KC Content Content Kind"},{"id":60750276,"name":"KC Content Product Version"},{"id":69107204,"name":"KC Video Audience"},{"id":69127027,"name":"KC Content Kind ID"}];

function findPropFromValue(arr, prop, key) {
  const [sKey, sVal] = [...Object.entries(prop)];
  return arr.find(el => el[sKey] === sVal)[key];
}

const id = findPropFromValue(arr, { name: 'KC Content Kind ID' }, 'id');
console.info(id);

const name = findPropFromValue(arr, { id: 69107204 }, 'name');
console.info(name);

Другие вопросы по теме