Javascript 在嵌套对象数组的任何级别中查找任何值?

Javascript 在嵌套对象数组的任何级别中查找任何值?,javascript,Javascript,我有一个嵌套对象数组 var arr = [{ tires: 2, exterior: { color: 'white', length: 2, width: 1 } },{ tires: 4, exterior: { color: 'blue', length: 5, width: 3 } },{ tires: 4, exterior: { color: 'white', length: 2,

我有一个嵌套对象数组

var arr = [{
  tires: 2,
  exterior: {
    color: 'white',
    length: 2,
    width: 1
  }
},{
  tires: 4,
  exterior: {
    color: 'blue',
    length: 5,
    width: 3
  }
},{
  tires: 4,
  exterior: {
    color: 'white',
    length: 2,
    width: 3
  }
}];
我想创建一个函数,以便:

var findItems = function(arr, value){
  // return array of found items
};
一些例子:

findItems(arr, 'white');                    // [ arr[0], arr[2] ]
findItems(arr, 2);                          // [ arr[0], arr[2] ]
findItems(arr, {tires: 2});                 // [ arr[0] ]
findItems(arr, {tires: 2, color: 'white'}); // [  ]
findItems(arr, {width: 1, color: 'white'}); // [ arr[0] ]
对于包含非嵌套对象的数组,或者如果您知道要搜索的确切级别,则很容易找到值。但我不知道如何在数组中找到“任意值,任意位置”。我很快就进入了地狱


如果有帮助的话,我可以使用下划线。

我想应该是这样的:

函数对象(val){
返回对象(val)==val;
}
功能搜索(val、ctx){
var valIsObject=等值对象(val);
返回(函数搜索(上下文){
如果(!isObject(context))返回val==context;
if(valIsObject&&Object.keys(val).every(函数(键)){
返回上下文[key]==val[key];
}))返回true;
返回Object.keys(上下文).some(函数(键){
返回搜索(上下文[key]);
});
})(ctx);
}
函数findItems(arr,value){
返回arr.filter(函数(项){
返回搜索(值、项目);
});
}

它应该工作得相当好,除了一些边缘情况,如循环引用(无限递归)或描述符属性(代码可能会在不兼容的对象上调用getter)。

。。如果“轮胎”在外部,你会需要某种机制来忽略它吗?@axelduch,不,现在不是。只需直接输入“此数组是否包含此值,在任何位置?”然后返回它出现的数组项。@Oriol,它只需尝试在对象数组中查找对象即可。如果找到它,它将返回带有该对象的数组项。就像在我的
findItems(myArray,{tires:2})
示例中一样。@Oriol,哦,我明白了。嗯。。。它不应该归还任何东西。哇,非常感谢。现在我要坐下来试着弄清楚为什么这个代码会起作用。总的来说,我仍然很难用递归来思考问题。除了对象数组包含一个“null”值的情况外,一切似乎都正常。然后“context”变为“null”,函数中断。@fuzzybabybunny我无法重现该问题。如果上下文为null,那么isObject应该返回false,然后代码不应该尝试访问null的属性。