筛选数组返回的不是数组的元素,而是索引号

Filter array returning not the elements of the array but the index numbers

提问人:user7212232 提问时间:11/16/2023 最后编辑:derpirscheruser7212232 更新时间:11/16/2023 访问量:31

问:

let class_required = new Array("bad", 
                           "bad", "good", "bad", 
                           "good", "bad", "bad", 
                           "bad", "good");

我只想返回“坏”的元素,但我希望返回索引号,希望使用 .filter 或 .map 等还不错

数组 字典 过滤器

评论


答:

0赞 derpirscher 11/16/2023 #1

您可以结合使用 Array.map 和 Array.filter

和的问题是,对于您的用例,您必须同时使用两者,因此迭代数组两次,因为mapfilter

  • map只能转换值,但不能跳过它们。即,结果将始终包含原始数组中所有值的转换,而不仅仅是您需要的值。
  • filter只能跳过值,而不能转换值。即过滤后的数组只能包含值,而不能包含索引。

您还必须按正确的顺序应用它们,因为如果您先进行过滤(因此要转换的值会更少),索引将是错误的。

let class_required = new Array("bad", 
                           "bad", "good", "bad", 
                           "good", "bad", "bad", 
                           "bad", "good");
                           
let filtered = class_required.map((x,i) => x === "bad" ? i : -1)
                 .filter(x => x >=0)
console.log(filtered);

或者你可以使用Array.reduce,它允许你将输入数组转换为你想要的任何数据结构。

let class_required = new Array("bad", 
                           "bad", "good", "bad", 
                           "good", "bad", "bad", 
                           "bad", "good");
                           
let filtered = class_required.reduce((a,c,i) => {
  if (c === "bad") a.push(i);
  return a;
}, []);

console.log(filtered);

当然,您也可以使用简单的for循环(实际上与上述循环的功能等价)reduce

let class_required = new Array("bad", 
                               "bad", "good", "bad", 
                               "good", "bad", "bad", 
                               "bad", "good");
let filtered = [];
for (let i = 0; i < class_required.length; i++) {
  if (class_required[i] === "bad") {
    filtered.push(i);
  }
}
console.log(filtered);