[英]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.