遍历JSON对象并根据指定的值返回键

3
在使用Postman进行API调用并得到结果后,我尝试在下面的成功函数中获取“KC Content Kind ID”值的对应ID。但由于它不是一个数组,我想知道在jQuery中是否可以使用“each”方法,并如何处理。我想通过进入facet对象来遍历这个嵌套的JSON对象,如果名称属性为“KC Content Kind ID”,则返回相应名称属性的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"
             }
          }
       }
    }

这是我的代码,我正在使用成功函数(success function)

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
所以我想说,如果在结果对象中找到与“KC Content Kind ID”匹配的“name”属性的“id”, - Tope
问题在于您的数据结构不好。Facets 应该是一个对象数组,而不是一个带有编号属性的对象。这样您就可以使用数组方法来定位正确的数据。如今,您必须将该数据转换为数组,然后才能执行任何操作,即每个操作都需要添加一步。 - James
4个回答

1
你可以使用 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)


1
你可以使用 Object.entriesfind 获取ID,如果你知道ID是唯一的,因为 Array.find 会在第一个匹配时停止。这也将返回ID以及对象的内容。

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]仅返回您匹配的ID。

1
如果您需要经常执行该操作,您可能会发现将数据重组为数组更易于使用。

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
你可以循环遍历 facets 对象,并确定最后一个单词是否指向除了 "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));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接