如何返回包含值的索引列表

时间:2019-07-17 19:51:04

标签: javascript arrays indexof

我有一个对象数组,想找到每个包含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的每个索引的列表?

6 个答案:

答案 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;
}, []);