Saya mencoba membalikkan dan membalikkan array di dalam array dua dimensi.

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

Saya telah membuat fungsi yang mengambil array dua dimensi a dan melakukan forEach di atasnya. Ini mengambil setiap array dalam dan membalikkannya. Saya kemudian mencoba mengambil array indivual yang baru saja dibalik dan mencoba melakukan map di atasnya untuk membalikkan setiap nilai di dalam array (bool => !bool).

Fungsi ini tampaknya berfungsi hingga reverse(), tetapi saya tidak tahu mengapa map() tampaknya tidak berfungsi. Apakah tidak mungkin untuk membuat rantai looping / fungsi panah berulang seperti ini?

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

Hasil yang diharapkan:

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

Hasil sebenarnya:

[[false, false, true], [true, true, false]]
1
rpivovar 28 Oktober 2019, 04:08

2 jawaban

Jawaban Terbaik

.map selalu membuat larik baru - larik yang ada tidak akan diubah. Baik .map untuk membuat larik baru yang lebih besar:

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));

Atau, jika Anda ingin bermutasi (tidak disarankan kecuali diperlukan), Anda harus secara eksplisit menetapkan ulang array dalam yang baru dipetakan ke indeks pada array luar:

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));
3
CertainPerformance 28 Oktober 2019, 01:11

Seperti yang ditunjukkan oleh CertainPerformance, metode peta mengembalikan array baru dan Anda tidak menetapkannya:

 var reverseInvert = ([...a]) => a.reverse().map(bool => !bool);
0
Addis 28 Oktober 2019, 01:25