繁体   English   中英

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

[英]Javascript: Finding index of an object in an array, based on a value within a nested array on the objects

我有一个看起来像这样的数组:

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

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

您可以使用findIndex和Array的some方法。

[
    {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

使用箭头功能,您可以很好,干净地完成Mathieu答案中显示的搜索

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

然后

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

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

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

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

arr.filter(item => item.fields.some(deepItem => deepItem.label === 'rar')); // [{...}, ...]

这是一种丑陋的做法。

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

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

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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM