【问题标题】:How to invert boolean arrays inside another array with map and forEach?如何使用 map 和 forEach 在另一个数组中反转布尔数组?
【发布时间】:2020-02-23 08:28:00
【问题描述】:

我正在尝试反转和反转二维数组中的数组。

let a = [[true, false, false], [false, true, true]];

我创建了一个函数,它接收二维数组a 并在其上执行forEach。这需要每个内部数组并将其反转。然后我尝试获取刚刚反转的单个数组并尝试对其执行map 以反转数组中的每个值(bool => !bool)。

这个功能似乎在reverse() 下工作,但我不明白为什么map() 似乎不起作用。像这样链接循环/迭代箭头函数是不可能的吗?

var reverseInvert = a => {
  a.forEach(arr => arr.reverse().map(bool => !bool));
  return a;
};

预期结果:

[[ true, true, false], [false, false, true]]

实际结果:

[[false, false, true], [true, true, false]]

【问题讨论】:

    标签: javascript arrays ecmascript-6


    【解决方案1】:

    .map 总是创建一个 new 数组 - 现有数组不会被改变。要么.map创建一个新的更大的数组:

    let a = [[true, false, false], [false, true, true]];
    var reverseInvert = a => {
      const newA = a.map(arr => arr.reverse().map(bool => !bool));
      return newA;
    };
    console.log(reverseInvert(a));

    或者,如果您想改变(除非必要,否则不推荐),您必须将新映射的内部数组显式重新分配给外部数组上的索引:

    let a = [[true, false, false], [false, true, true]];
    var reverseInvert = a => {
      a.forEach((arr, i, outerArr) => {
        outerArr[i] = arr.reverse().map(bool => !bool)
      });
      return a;
    };
    console.log(reverseInvert(a));

    【讨论】:

    • 删除我以前的 cmets,因为我在添加新代码后忘记注释掉我的旧代码。我是个白痴 =) 感谢您的帮助
    【解决方案2】:

    CertainPerformance 指出 map 方法返回一个新数组并且您没有分配它:

     var reverseInvert = ([...a]) => a.reverse().map(bool => !bool);
    

    【讨论】:

      猜你喜欢
      • 2012-11-23
      • 2016-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多