简体   繁体   English

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

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

I have an array that looks like this: 我有一个看起来像这样的数组:

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

I'm looking for the index of the object which has a field matching label === 'rar' , so I can update that particular field. 我正在寻找具有field匹配label === 'rar'的对象的索引 ,因此我可以更新该特定字段。 Is there an optimum way to accomplish this? 有没有最佳方法来实现这一目标? I know indexOf won't get me there by itself, but I'm struggling with the logic. 我知道indexOf不会让我自己,但我正在努力解决这个问题。

You can use the findIndex and some methods of Array. 您可以使用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';
   });
})

returns 1 返回1

With arrow functions you can do the searches shown in Mathieu's answer nice and cleanly 使用箭头功能,您可以很好,干净地完成Mathieu答案中显示的搜索

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

Then 然后

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

If you're more interested in accessing the item itself, not it's index, then use arr.find instead 如果你对访问项目本身更感兴趣,而不是它的索引,那么请使用arr.find

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

Further, if you want every item which matches, then use arr.fileter instead 此外,如果您想要匹配的每个项目,请改用arr.fileter

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

an ugly way of doing it. 这是一种丑陋的做法。

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

a 'normal' way of doing it: 这是一种“正常”的做法:

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'));

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

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

相关问题 Javascript:迭代嵌套在 object 中的对象数组作为值 - Javascript: Iterate over an array of objects nested within an object as a value 根据对象字段值查找javascript“对象数组”的索引 - Find index of javascript “array of objects” based on object field value 根据嵌套对象值收集对象数组 - Collect array of objects based on nested object value 更改对象中值的状态,在对象数组中的索引处,在对象中? - Changing state of a value in an object, at an index within an array of objects, within a object? 在JavaScript中的对象数组中查找数组元素的索引? - Finding the index of an array element in an array of objects in JavaScript? 根据 javascript 中嵌套的 object 值对数组进行排序 - Sorting array based on nested object value in javascript 在Javascript中的嵌套对象数组中查找目标对象的路径 - Finding a path to target object in nested array of objects in Javascript 在JavaScript中的对象的二维数组中查找值的索引 - Finding index of value in two dimensional array of objects in javascript 在javascript数组中寻找价值 - Finding value within javascript array JavaScript:分配给数组中的对象会更改数组中所有对象的值 - JavaScript: assignment to an object within an array changes the value of all objects in the array
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM