因此,我正在寻找类似Array.prototype.findIndex的函数,该函数返回索引数组。像Array.prototype.find
和Array.prototype.filter
一样,分别返回一个项目和一组项目。我当时在看MDN,但找不到合适的东西。
我想与未来的javascript版本兼容,是否计划添加一些内容?
答案 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)