深入查找嵌套对象中的键

假设我有一个对象:

[ { 'title': "some title" 'channel_id':'123we' 'options': [ { 'channel_id':'abc' 'image':'http://asdasd.com/all-inclusive-block-img.jpg' 'title':'All-Inclusive' 'options':[ { 'channel_id':'dsa2' 'title':'Some Recommends' 'options':[ { 'image':'http://www.asdasd.com' 'title':'Sandals' 'id':'1' 'content':{ ... 

我想find一个对象,其中id是1.是否有这样的function? 我可以使用_.filter_.filter方法,但是我必须从顶部开始并过滤掉。

recursion是你的朋友。 我更新了函数来说明属性数组:

 function getObject(theObject) { var result = null; if(theObject instanceof Array) { for(var i = 0; i < theObject.length; i++) { result = getObject(theObject[i]); if (result) { break; } } } else { for(var prop in theObject) { console.log(prop + ': ' + theObject[prop]); if(prop == 'id') { if(theObject[prop] == 1) { return theObject; } } if(theObject[prop] instanceof Object || theObject[prop] instanceof Array) { result = getObject(theObject[prop]); if (result) { break; } } } } return result; } 

更新jsFiddle: http : //jsfiddle.net/FM3qu/7/

如果要在search对象时获取其ID为1的第一个元素,则可以使用此函数:

 function customFilter(object){ if(object.hasOwnProperty('id') && object["id"]==1) return object; for(var i=0;i<Object.keys(object).length;i++){ if(typeof object[Object.keys(object)[i]]=="object"){ o=customFilter(object[Object.keys(object)[i]]); if(o!=null) return o; } } return null; } 

如果你想得到所有的元素的ID是1,那么(所有的元素的ID是1被存储在你看到的结果):

 function customFilter(object,result){ if(object.hasOwnProperty('id') && object.id=1) result.push(object); for(var i=0;i<Object.keys(object).length;i++){ if(typeof object[Object.keys(object)[i]]=="object"){ customFilter(object[Object.keys(object)[i]],result); } } } 

我为此创build了库: https : //github.com/dominik791/obj-traverse

你可以像这样使用findFirst()方法:

 var foundObject = findFirst(rootObject, 'options', { 'id': '1' }); 

而现在foundObjectvariables存储你正在寻找的对象的引用。

我发现这个网页通过Googlesearch相似的function。 基于Zach和regularmike提供的工作,我创build了另一个适合我需求的版本。
顺便说一句,有趣的工作Zah和regularmike! 我会在这里发布代码:

 function findObjects(obj, targetProp, targetValue, finalResults) { function getObject(theObject) { let result = null; if (theObject instanceof Array) { for (let i = 0; i < theObject.length; i++) { getObject(theObject[i]); } } else { for (let prop in theObject) { if(theObject.hasOwnProperty(prop)){ console.log(prop + ': ' + theObject[prop]); if (prop === targetProp) { console.log('--found id'); if (theObject[prop] === targetValue) { console.log('----found porop', prop, ', ', theObject[prop]); finalResults.push(theObject); } } if (theObject[prop] instanceof Object || theObject[prop] instanceof Array){ getObject(theObject[prop]); } } } } } getObject(obj); } 

它所做的是findobj任何对象,其属性名称和值匹配targetProptargetValue ,并将其推送到targetProp数组。 这是jsfiddle玩耍: https ://jsfiddle.net/alexQch/5u6q2ybc/

如果您已经在使用Underscore,请使用_.find()

 _.find(yourList, function (item) { return item.id === 1; });