代码之家  ›  专栏  ›  技术社区  ›  user7212232

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

  •  0
  • user7212232  · 技术社区  · 1 年前
    let class_required = new Array("bad", 
                               "bad", "good", "bad", 
                               "good", "bad", "bad", 
                               "bad", "good");
    

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

    0 回复  |  直到 1 年前
        1
  •  0
  •   derpirscher    1 年前

    您可以使用以下组合 Array.map Array.filter

    问题在于 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);