Javascript: Boş Bir 3B Diziyi İtme

Oct 06 2020

Boş bir 3x3x1 3B dizi oluşturuyorum

[
  [[],[],[]],
  [[],[],[]],
  [[],[],[]]
]

Şimdi, pozisyonda eleman arr[1][1]olduğunu []ben çalıştırırsak, Yani, arr[1][1].push(1)o eklemek gerekir 1pozisyonaarr[1][1]

JS'de boş bir 3x3x1 dizisi oluşturmak için 2 yöntem vardır, İşte kod,

var arr1 = [...new Array(3)].map(e => [...new Array(3)].fill([]));
var arr2 = [[[],[],[]],[[],[],[]],[[],[],[]]];
arr1[1][1].push(1);
arr2[1][1].push(1);
console.log(arr1)
console.log(arr2)

yani. Kısayol ve başka elle, hem yoluyla arr1ve arr2aynı olmalıdır, yani olması gerektiği çıkışı, Ama çıkış olarak takip edilir,

[[[], [], []], [[1], [1], [1]], [[], [], []]]

[[[], [], []], [[], [1], []], [[], [], []]]

Neden ilk dizi böyle bir çıktı veriyor? İkisi de aynı değil mi?

Çıktının 2. formda olmasını istiyorum, boş bir 3x3x1 dizisi oluşturmanın yanlış bir yolu varsa, lütfen beklenen çıktıyı verecek bir yöntem önerin.

Yanıtlar

3 zero298 Oct 06 2020 at 16:53

Bir tane daha iç içe geçmiş harita kullanın. Ben düşünüyorum fillçağrı ilk dolduracaktır mapile aynı yerine 2 boyutu, tüm başvuru aynı dizi anlamına eşsiz birinin 2 boyutun her birinde dizisi.

fillHatta dokümanlar value, tamamen aynı olacağını not ediyor :

Diziyi dolduracak değer. (Dizideki tüm öğelerin bu tam değer olacağını unutmayın.)

Ayrıca (dizi bir nesnedir):

İlk parametre bir nesneyse, dizideki her yuva bu nesneye başvurur.

const arr1 = [...new Array(3)].map(e => [...new Array(3)].fill([]));
const arr2 = [[[],[],[]],[[],[],[]],[[],[],[]]];
const arr3 = [...new Array(3)].map(() => [...new Array(3)].map(() => []));

arr1[1][1].push(1);
arr2[1][1].push(1);
arr3[1][1].push(1);

console.log(JSON.stringify(arr1)); // [[[],[],[]],[[1],[1],[1]],[[],[],[]]]
console.log(JSON.stringify(arr2)); // [[[],[],[]],[[],[1],[]],[[],[],[]]]
console.log(JSON.stringify(arr3)); // [[[],[],[]],[[],[1],[]],[[],[],[]]]

Başka bir deyişle:

const expandedArr1 = [...new Array(3)].map(() => {
  /*
   * From MDN fill documentation:
   * Value to fill the array with. (Note all elements in the array will be this exact value.)
   */
  return [...new Array(3)].fill([]); // Every element will get this exact value (reference)
});

// They are the same reference:
console.log(expandedArr1[1][1] === expandedArr1[1][2]);

2 SachinNayak Oct 06 2020 at 16:57

Bunun olmasının nedeni, doldurma yönteminin üçünde de "tam değeri" doldurmasıdır.

MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/fill Parametre değeri açıklamasındaki Nota bakın.

var arr1 = [...new Array(3)].map(e => [...new Array(3)].map(e=>[])); // Note that i have used a map with a function returning an array([]) instead of your fill method
var arr2 = [[[],[],[]],[[],[],[]],[[],[],[]]];
arr1[1][1].push(1);
arr2[1][1].push(1);
console.log(arr1)
console.log(arr2)