Как инвертировать логические массивы внутри другого массива с помощью map и forEach? - PullRequest
1 голос
/ 28 октября 2019

Я пытаюсь инвертировать и инвертировать массивы внутри двумерного массива.

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]]

Ответы [ 2 ]

3 голосов
/ 28 октября 2019

.map всегда создает новый массив - существующий массив не будет видоизменяться. Либо .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));
0 голосов
/ 28 октября 2019

Как указал CertainPerformance, метод map возвращает новый массив, и вы не назначаете его:

 var reverseInvert = ([...a]) => a.reverse().map(bool => !bool);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...