Javascript:根据对象上嵌套数组中的值查找数组中对象的索引

时间:2016-05-17 21:56:03

标签: javascript arrays

我有一个如下所示的数组:

[{
    name: 'foobar',
    fields: [{
        label: 'argle'
    },{
        label: 'bargle'
    }]
},{
    name: 'baz',
    fields: [{
        label: 'rar'
    },{
        label: 'hoogah'
    }]
}]

我正在寻找具有field匹配label === 'rar'的对象的索引,因此我可以更新该特定字段。有没有最佳方法来实现这一目标?我知道indexOf不会让我独自到达那里,但我正在努力解决这个问题。

4 个答案:

答案 0 :(得分:5)

您可以使用Array的findIndexsome方法。

[
    {name: 'foobar', fields: [{label: 'argle'}, {label: 'bargle'}]},
    {name: 'baz', fields: [{label: 'rar'}, {label: 'hoogah'}]}
].findIndex(function(element, index, array) {
   return element.fields.some(function(element, index, array) {
     return element.label === 'rar';
   });
})

返回1

答案 1 :(得分:2)

使用arrow functions,您可以执行Mathieu's answer很好,干净的

中显示的搜索
FileHandleResolver resolver = new InternalFileHandleResolver();
        manager.setLoader(FreeTypeFontGenerator.class, new FreeTypeFontGeneratorLoader(resolver));
        manager.setLoader(BitmapFont.class, ".ttf", new FreetypeFontLoader(resolver));

        FreetypeFontLoader.FreeTypeFontLoaderParameter params59 = new FreetypeFontLoader.FreeTypeFontLoaderParameter();
        params59.fontFileName = font_dpb_59;
        params59.fontParameters.size = 59;
        manager.load(font_dpb_59, BitmapFont.class, params59);

然后

let arr = [
  {name: 'foobar', fields: [{label: 'argle'}, {label: 'bargle'}]},
  {name: 'baz', fields: [{label: 'rar'}, {label: 'hoogah'}]}
];

如果您对访问该项目本身更感兴趣,而不是它的索引,那么请改用arr.find

arr.findIndex(item => item.fields.some(deepItem => deepItem.label === 'rar')); // 1

此外,如果您想要匹配的每个项目,请使用arr.fileter代替

arr.find(item => item.fields.some(deepItem => deepItem.label === 'rar')); // Object

答案 2 :(得分:0)

这是一种丑陋的做法。

var data = [
  {name: 'foobar', fields: [{label: 'argle'}, {label: 'bargle'}]},
  {name: 'baz', fields: [{label: 'rar'}, {label: 'hoogah'}]}
],

i = data.findIndex(e => ~e.fields.findIndex(f => f.label == 'rar'));
// returns 1

答案 3 :(得分:0)

这是一种“正常”的做法:

var arr = [
  {name: 'foobar', fields: [{label: 'argle'}, {label: 'bargle'}]},
  {name: 'baz', fields: [{label: 'rar'}, {label: 'hoogah'}]},
  {name: 'foo', fields: [{label: 'asjda'}, {label: 'hoogah'}]}
];

function findByLabel(arr, str) {
  var res = null;
  arr.forEach(function(item) { 
      if (item.fields[0].label == 'rar')
          res = item
  });
  return res;
} 

console.log(findByLabel(arr, 'rar'));

演示:https://jsfiddle.net/5h8ugasf/4/