是否有类似filterIndex的内容?

时间:2019-07-29 10:58:55

标签: javascript

因此,我正在寻找类似Array.prototype.findIndex的函数,该函数返回索引数组。像Array.prototype.findArray.prototype.filter一样,分别返回一个项目和一组项目。我当时在看MDN,但找不到合适的东西。

我想与未来的javascript版本兼容,是否计划添加一些内容?

4 个答案:

答案 0 :(得分:1)

您可以将索引与值一起映射,并获取回调并返回索引数组。

Array.prototype.filterIndex = function (cb) {
    return this
        .map((o, i) => [o, i])
        .filter(([o]) => cb(o))
        .map(([, i]) => i);
};

console.log(['a', 'b', 'a'].filterIndex(v => v === 'a'));

答案 1 :(得分:1)

为什么不使用现有方法Array.prototype.reduce

let out = ['a','b','a'].reduce((acc, curr, i) => (curr === 'a' && acc.push(i), acc), []);	
console.log(out)

答案 2 :(得分:1)

我猜想最合适的内置方法是flatMap,您可以将其用于映射数组:

['a', 'c', 'a', 'b'].flatMap((v, i) => v == 'a' ? [i] : [])

我不知道有任何提议添加这样的功能。如果您更经常需要此功能,则可以编写自己的帮助函数:

function findIndices(array, callback, ctx) {
    const res = [];
    for (let i=0; i<array.length; i++)
        if (callback.call(ctx, array[i], i, array))
            res.push(i);
    return res;
}

findIndices(['a', 'c', 'a', 'b'], v => v == 'a')

答案 3 :(得分:0)

您甚至可以使用.map

var array1 = ['a', 'b', 'a'];
let data = array1.map((data,index) => data == "a" ? index : []).join('').split('')
console.log(data)

您甚至可以通过执行forEach返回索引,如果回调匹配,则返回索引。

Array.prototype.filterIndex = function(cb) {
  let arr = [];
  this.forEach((a, index) => {
    if (cb(a)) arr.push(index)
  })
  return arr
}
var array1 = ['a', 'b', 'a'];

let data = array1.filterIndex((data) => data == "a")
console.log(data)