在数组内的数组中查找元素,并使用父对象返回元素

时间:2018-02-27 17:41:55

标签: javascript underscore.js

...鉴于

    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 } ]};

4 个答案:

答案 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; }