Javascript 循环遍历JSON对象并基于指定值返回键
在与postman的api调用获得结果后,我试图在下面的成功函数中获得值“KC Content Kind id”的对应id,但由于它不是一个数组,我想知道每个id是否都能在jquery中工作,以及如何进行。我想通过进入facet对象来循环这个嵌套的json对象,如果name属性是“KC Content Kind ID”,那么返回对应name属性的IDJavascript 循环遍历JSON对象并基于指定值返回键,javascript,object,Javascript,Object,在与postman的api调用获得结果后,我试图在下面的成功函数中获得值“KC Content Kind id”的对应id,但由于它不是一个数组,我想知道每个id是否都能在jquery中工作,以及如何进行。我想通过进入facet对象来循环这个嵌套的json对象,如果name属性是“KC Content Kind ID”,那么返回对应name属性的ID "results": { "data": { "facets": { "60
"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 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>');
}
});
函数getAvailableKinds(){
$.ajax({
url:csexe+“/api/v2/facets/”+getLocationId(),
数据类型:“json”,
键入:“获取”,
发送前:函数(xhr){
setRequestHeader(“OTCSticket”,getAuthToken());
},
成功:功能(响应){
var obj=response.results.data.facets;
$。每个(对象、功能(项目、值){
如果(value.name==“KC内容种类ID”){
var idRequired=对象id;
}
});
},
错误:函数(jqXHR、textStatus、errorshown){
警报(“发生错误…查看控制台”);
$(“body”).html(“状态代码:”+jqXHR.status+”抛出的错误:“+errorthround+”响应文本:”+jqXHR.responseText+”;
}
});
您可以使用,然后使用基于测试的结果。例如:
let results={“data”:{“facets”:{“60749428”:{“id”:60749428,“name”:“KC内容种类”},“60750276”:{“id”:60750276,“name”:“KC内容产品版本”},“69107204”:{“id”:69107204,“name”:“KC视频观众”},“69127027”:{“id”:69127027,“name”:“KC
设obj=results.data.facets;
设k=Object.keys(obj).filter(key=>obj[key].name==“KC内容种类ID”)
//所有匹配项的数组
console.log(k)
如果您知道id是唯一的,那么您可以使用该id获取id,并查找该id,因为它将在第一次匹配时停止。这还将返回id以及对象的内容
const d={“data”:{“facets”:{“60749428”:{“id”:60749428,“name”:“KC内容种类”},“60750276”:{“id”:60750276,“name”:“KC内容产品版本”},“69107204”:{“id”:69107204,“name”:“KC视频观众”},“69127027”:{“id”:69127027,“name”:“KC
const r=Object.entries(d.data.facets.find)([k,v])=>v.name==“KC内容种类ID”)
console.log(r?r[0]:未定义)
您可以在facets对象上循环,并确定最后一个单词是否指向除名称
以外的单独属性。如果它指向另一个属性,则返回该属性,如果不指向,则返回名称
Object.values(obj).map(o => {
let prop = o.name.split(" ").pop().toLowerCase();
return (prop in o) ? o[prop] : o.name;
});
让apiResult={
“结果”:{
“数据”:{
“方面”:{
"60749428": {
“id”:60749428,
“名称”:“KC内容种类”
},
"60750276": {
“id”:60750276,
“名称”:“KC内容产品版本”
},
"69107204": {
“id”:69107204,
“名称”:“KC视频观众”
},
"69127027": {
“id”:69127027,
“名称”:“KC内容种类ID”
}
}
}
}
};
常量循环=(obj)=>Object.values(obj.map)(o=>{
让prop=o.name.split(“”.pop().toLowerCase();
返回(o中的prop)→o[prop]:o.name;
});
console.log(循环(apireult.results.data.facets));
如果要经常执行该操作,您可能会发现将数据重新构造为数组更容易使用
const results={“data”:{“facets”:{“60749428”:{“id”:60749428,“name”:“KC内容种类”},“60750276”:{“id”:60750276,“name”:“KC内容产品版本”},“69107204”:{“id”:69107204,“name”:“KC视频观众”},“69127027”:{“id”:69127027,“name”:“KC;
//获取刻面键的列表
constkeys=Object.keys(results.data.facets);
//将这些镶嵌面对象拉入阵列
const arr=keys.reduce((acc,key)=>acc.concat(results.data.facets[key]),[]);
//找到与所需名称匹配的对象,并返回id
const id=arr.find(el=>el.name==='KC内容种类id').id;
控制台日志(id)
因此,您希望最后一个单词(不管是什么)是对象上的查找属性,该对象的名称与文本的其余部分匹配?因此,我想说,如果在该结果对象中获取与“KC Content Kind id”匹配的“name”属性的“id”,则问题在于您的数据结构不良。面应该是一个数组f对象,而不是具有编号属性的对象。然后,您可以简单地使用数组方法定位正确的数据。实际上,在对数据执行任何操作之前,您必须将该数据转换为数组,即为每个操作添加一个步骤。