我有一个对象数组,想找到每个包含first_name = 'Ryu'
的索引。
let list = [{
order:{
contact: {
first_name: 'Ryu'
}
}
},
{},{},{},...] // more order objects
我可以检查是否存在单个索引,如下所示:
let doesContactExist = list
.map(i => i.order)
.map(i => i.contact)
.map(i => i.first_name).indexOf('Ryu')`
但是如何返回包含Ryu
的每个索引的列表?
答案 0 :(得分:2)
我会去
const indices = list.map((obj, index) =>
obj.order.contact.first_name == 'Ryu' ? index : -1
).filter(i =>
i >=0
);
答案 1 :(得分:1)
您可以使用.map()
返回索引或-1
,具体取决于它是否与搜索字符串匹配,然后过滤掉所有-1
。
let indexes = list.map(({order: {contact: {first_name}}}, i) =>
first_name == 'Ryu' ? i : -1)
.filter(i => i >= 0);
答案 2 :(得分:1)
您可以使用reduce
将数组转换为另一个索引数组。索引是对象与谓词匹配的索引。 (在这种情况下,a
属性需要包含字符串oo
):
const foo =
[ {a: 'foo'},
{a: 'boo'},
{a: 'bar'} ];
const idx = foo.reduce((acc, obj, i) =>
obj.a.includes('oo') ? acc.concat(i) : acc, []);
console.log(idx);
答案 3 :(得分:1)
无需链接数组函数并重复多次;使用.reduce()
代替:
let list = [
{order:{contact: {first_name: 'Ryu'}}}, //0 <----
{order:{contact: {first_name: 'Ken'}}}, //1
{order:{contact: {first_name: 'Guile'}}}, //2
{order:{contact: {first_name: 'Ryu'}}} //3 <----
];
let result = list.reduce((output, {order:{contact:{first_name}}}, idx) =>
first_name === 'Ryu' //Is the first name Ryu?
? [...output, idx] //Yes: Add the index to the result
: output //No: Leave the result as-is
, []);
console.log(result);
如果名字只需要 include "Ryu"
而不是完全匹配,只需将first_name === 'Ryu'
更改为first_name.includes('Ryu')
。
答案 4 :(得分:-1)
Array.prototype.filter()
mdn是您要寻找的。
let doesContactExist = list.
.map(i => i.order)
.map(i => i.contact)
.map(i => i.first_name).
.map((name, i) => {name, i})
.filter(({name}) => name === 'Ryu')
.map({i} => i);
答案 5 :(得分:-1)
我会使用Array.reduce
let list = [{
order:{
contact: {
first_name: 'Ryu'
}
}
}]
const indices = list.reduce((accum, obj, index) => {
if (obj.order.contact.first_name === 'Ryu') {
accum.push(index);
}
return accum;
}, []);