...鉴于
var a = [{ b: [{ i: 2 }, { i: 3 }] }, { b: [{ i: 4 }, { i: 5 }] }, { b: [{ i: 6 }, { i: 7 }] }];
找到对象的好方法是什么,例如,使用i = 5
加上包含它所在数组的对象?
所以,结果将是两个参考...
var r0 = { "i": 5 };
var r1 = { "b": [{ "i": 4 }, { "i": 5 } ]};
答案 0 :(得分:1)
您可以使用forEach
:
var a = [{ b: [{ i: 2 }, { i: 3 }] }, { b: [{ i: 4 }, { i: 5 }] }, { b: [{ i: 6 }, { i: 7 }] }];
var r0;
var r1;
a.forEach(function(item){
item.b.forEach(function(inner){
if(inner.i==5){
r0 = inner; r1 = item;
}
});
});
console.log(r0);
console.log(r1);

答案 1 :(得分:0)
使用箭头functions:
var a = [{ b: [{ i: 2 }, { i: 3 }] }, { b: [{ i: 4 }, { i: 5 }] }, { b: [{ i: 6 }, { i: 7 }] }];
var result = a.filter(x => x.b.find(b => b.i == 5));
console.log(result)
或使用普通功能:
var a = [{ b: [{ i: 2 }, { i: 3 }] }, { b: [{ i: 4 }, { i: 5 }] }, { b: [{ i: 6 }, { i: 7 }] }];
var result = a.filter(function (x) {
return x.b.find(function(b) {
return b.i == 5;
});
});
console.log(result);
答案 2 :(得分:0)
我认为解决方案可能会根据您的实际背景而有所不同,例如您考虑的因素是最重要的因素,如时间,空间,读/写效率等。
以下是两种基本用法的解决方案:
var a = [{ b: [{ i: 2 }, { i: 3 }] }, { b: [{ i: 4 }, { i: 5 }] }, { b: [{ i: 6 }, { i: 7 }] }]
//The commom way: it has to loop whole array for each query
queryItem1 = function(searchTarget, searchVal) {
return searchTarget.filter(
function(val){
return val.b.filter(function(item){return item.i===searchVal;}).length>0;
}
)
}
console.log('---common way----')
console.log(queryItem1(a, 5))
console.log('---end----')
//Considering `query` efficiency;
//build index once, then query by one step instead of loop
buildIndexes = function(target) {
let indexes = new Object();
for(index in target) {
for(itemIndex in target[index].b) {
let queryVal = target[index].b[itemIndex].i;
let queryIndex = index;
if(!indexes[queryVal]) {
indexes[queryVal] = [];
}
indexes[queryVal].push(queryIndex);
}
}
return indexes;
}
console.log('---consider `query` efficiency way----')
indexes = buildIndexes(a)
//console.log(indexes) //display index tree
console.log('---test case 1----')
console.log(indexes[5]) //if query vale is 5, get the index, then call like a[indexes[5][0]]
console.log(a[indexes[5][0]])
console.log('---test case 2----')
console.log(indexes[6]) //if query vale is 6, get the index, then call like a[indexes[6][0]]
console.log(a[indexes[6][0]])
console.log('---end----')

答案 3 :(得分:0)
您可以对两次迭代都进行Array#some
,因为如果找到,迭代将通过返回true
来停止。
此提案返回条件为true
的第一个找到的元素。
var array = [{ b: [{ i: 2 }, { i: 3 }] }, { b: [{ i: 4 }, { i: 5 }] }, { b: [{ i: 6 }, { i: 7 }] }],
i = 5,
r0, r1;
array.some(function (a) {
return a.b.some(function (b) {
if (b.i === i) {
r0 = b;
r1 = a;
return true;
}
});
});
console.log(r0);
console.log(r1);

.as-console-wrapper { max-height: 100% !important; top: 0; }