javascript,获取数组中给定值的索引

时间:2017-06-20 02:55:04

标签: javascript

此JavaScript代码尝试在新数组中获取给定值5的索引。知道如何以优雅的方式做到这一点。我冷使用循环,但我希望使用map或reduce。谢谢。

console.log( [1, 2, 3, 5, 6, 5].map((y, i) => {
  if (y === 5) return i
}))
// gives --> [undefined, undefined, undefined, 3, undefined, 5]
// expected [3,5]

6 个答案:

答案 0 :(得分:2)

不幸的是mapreduce在JavaScript中没有延迟评估(即它们不是生成器/迭代器),但是如果你不介意双数组分配,那么你可以做到这一点:

var indices = [ 1, 2, 3, 5, 6, 5 ]
    .map( ( e, i ) => e == 5 ? i : -1 )
    .filter( e => e > -1 );

// indicies == [3,5]

另一种方法,更便宜:

var indices = [];
[ 1, 2, 3, 5, 6, 5 ].forEach( (e, i) => e == 5 ? indices.push( i ) : null );

这利用了您可以在void三元运算符中使用?:表达式的事实。

答案 1 :(得分:2)

您可以使用reduce。回调的第三个参数是索引。

[1, 2, 3, 5, 6, 5].reduce((indexes, n, index) => {
  if (n === 5) indexes.push(index)
  return indexes
}, [])

答案 2 :(得分:2)

您可以使用map()reduce()

reduce()将能够在一个循环中完成:

[1,2,3,4,5].reduce((result, num, index) => result.concat(num === 5 ? index : []), []);

使用concat()代替push()稍微慢一点,但更清晰,并且在相当小的集合中,差异可以忽略不计。

map()需要filter()才能删除其他内容:

[1,2,3,4,5].map((num, index) => num === 5 && index)
    .filter(e => e !== false);

.filter(Boolean)是一种干净,简洁的方法,可以将任何值转换为布尔值,然后该过滤器将用于确定它需要执行的操作。 num === 5 && index将是false或索引。另一种干净的方式。

答案 3 :(得分:1)

您可以在阵列上使用 reduce 运算符:

 [1,2,3,5,6,5].reduce(function(a, e, i) {
        if (e === 5)
            a.push(i);
        return a;
    }, []);

答案 4 :(得分:1)

您可以运行一个映射来测试该值并写入null(不匹配)或位置(匹配),然后使用过滤器删除空值。

地图看起来像这样:

map( (value, index) => {
  return value === 5 ? index : null;
})

然后你会像这样过滤它:

filter( (value) => {
  return value != null;
})

答案 5 :(得分:1)

console.log( [1, 2, 3, 5, 6, 5].map((y, i) => {
  if (y === 5) return i
}).filter((x) => {return /\d/.test(x);}));