Цикл по объекту JSON и возврат ключа на основе указанного значения - PullRequest
0 голосов
/ 29 ноября 2018

После получения результатов моего вызова API с почтальоном я пытался получить соответствующий идентификатор значения «KC Content Kind ID» в моей функции успеха ниже, но, поскольку это не массив, мне было интересно, будет ли каждый работать в jqueryи как это сделать.Я хочу пройти через этот вложенный объект json, войдя в объект фасета и сказать, что если атрибут имени - «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>');
    }
});

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

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

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.log(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.log(id);

const name = findPropFromValue(arr, { id: 69107204 }, 'name');
console.log(name);
0 голосов
/ 29 ноября 2018

Вы получаете идентификатор с 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.log(r ? r[0] : undefined)

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

0 голосов
/ 29 ноября 2018

Вы можете перебрать объект фасетов и определить, указывает ли последнее слово на отдельное свойство, отличное от 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.log(loop(apiResult.results.data.facets));
0 голосов
/ 29 ноября 2018

Вы можете использовать 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.log(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.log(k)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...