2016-03-27 13 views
-1

Ben nodejs projedizesi çok ikinci dize arg yerine concat, olası ES6 sorunu

const XPOSITIONS = [{ 
 
        "name": 'a', 
 
        "index": 0 
 
         }, 
 
        { 
 
        "name": 'b', 
 
        "index": 1 
 
         }, 
 
        { 
 
        "name": 'c', 
 
        "index": 2 
 
         }, 
 
        { 
 
        "name": 'd', 
 
        "index": 3 
 
         }, 
 
        { 
 
        "name": 'e', 
 
        "index": 4 
 
         }, 
 
        { 
 
        "name": 'f', 
 
        "index": 5 
 
         }, 
 
        { 
 
        "name": 'g', 
 
        "index": 6 
 
         }, 
 
        { 
 
        "name": 'h', 
 
        "index": 7 
 
         } 
 
        ]; 
 
const YPOSITIONS = [{ 
 
        "name": '1', 
 
        "index": 1 
 
         }, 
 
        { 
 
        "name": '2', 
 
        "index": 2 
 
         }, 
 
        { 
 
        "name": '3', 
 
        "index": 3 
 
         }, 
 
        { 
 
        "name": '4', 
 
        "index": 4 
 
         }, 
 
        { 
 
        "name": '5', 
 
        "index": 5 
 
         }, 
 
        { 
 
        "name": '6', 
 
        "index": 6 
 
         }, 
 
        { 
 
        "name": '7', 
 
        "index": 7 
 
         }, 
 
        { 
 
        "name": '8', 
 
        "index": 8 
 
         } 
 
        ]; 
 

 
function makeboard() { 
 
    "use strict"; 
 

 
    var boardArray = Array(...Array(...XPOSITIONS)).map(() => Array(...YPOSITIONS)); 
 
    
 
    XPOSITIONS.forEach(function(x, xindex, xarray) { 
 
     // console.log("x" + xindex); 
 
     
 
     YPOSITIONS.forEach(function(y, yindex, yarray) { 
 
      // console.log("y" + yindex); 
 
      // console.log("x check" + xindex, x.index); 
 

 
      boardArray[xindex][yindex].name = x.name.concat(y.name); 
 
      console.log("xindex " + xindex, "yindex " + yindex, "xname " + x.name, "yname " + y.name, boardArray[xindex][yindex].name); 
 
      boardArray[xindex][yindex].xindex = x.index; 
 
      boardArray[xindex][yindex].yindex = y.index; 
 
     }); 
 
     // console.log(boardArray); 
 
    }); 
 
    return boardArray; 
 
} 
 

 
var board = makeboard();

için ES6 bir satranç tahtası oluşturmak için kod yazıyorum. Ben Sonra onun adı bu 2d dizideki her kareyi atamak deneyin bir 8X8 2d dizisi

var boardArray = Array(...Array(...XPOSITIONS)).map(() => Array(...YPOSITIONS)); 

oluşturmalarını eşlenen bu

const XPOSITIONS = [{ 
       "name": 'a', 
       "index": 0 
        },... 
const YPOSITIONS = [{ 
       "name": '1', 
       "index": 1 
        },... 

gibi kenarları adı için const (sabitleri) sahip böylece kare adını yaptığı gibi her tahta kare isim atama y.name de değişir sonra forEach döngüde

XPOSITIONS.forEach(function(x, xindex, xarray) { 
    YPOSITIONS.forEach(function(y, yindex, yarray) { 

     boardArray[xindex][yindex].name = x.name.concat(y.name); 

    }); 

Ama sorun

yname a1 
yname a2 
yname a3 
yname a4 
yname a5 
yname a6 
yname a7 
yname a8 
yname ba1 
yname ba2 
yname ba3 
yname ba4 
yname ba5 
yname ba6 
yname ba7 
yname ba8 
yname cba1 
yname cba2 
yname cba3 
yname cba4 
yname cba5 
yname cba6 
yname cba7 
yname cba8 
yname dcba1 
yname dcba2 
yname dcba3 
yname dcba4 
yname dcba5 
yname dcba6 
yname dcba7 
yname dcba8 
yname edcba1... 

Sorun ne olabilir, yoksa ne yapıyorum? Lütfen es6 için yeni olduğum ve javascript ile çok büyük olmamasına yardım edin. geliştirici konsolunda

bakınız kod parçacığı

+1

Burada bazı genel yanlış anlama/aşırı özellik var gibi görünüyor; örnek; const const XPOSITIONS = 'abcdefgh'.split (' '); 'ilk 16 satır kodunuzun yerini alır ve eşit gösterim içerir. 'YPOSITIONS' daha da basit. Ayrıca, 2 boyutlu bir dizinin 2 boyutlu bir satranç tahtası için tek veri soyutlaması olduğunu düşünerek kendinizi delirtmeyin. Bu sorunu çözmek için birçok alternatif yol var. – naomik

cevap

1

Sen dizileri her içerikleri aynı nesne referanslarını geçiyoruz. Bu yüzden değiştirilen orijinal nesneleri görüyorsunuz, bu da döngülerde .name nesnelerini birleştirdiğinizde bir kartopu etkisi yaratır.

Özellikle, bu satır: her satır kullanılmaktadır aynı görememe gibi

var y1 = { name: '1', index: 1 }; 
var y2 = { name: '2', index: 2 }; 
var y3 = { name: '3', index: 3 }; 
var y4 = { name: '4', index: 4 }; 
var y5 = { name: '5', index: 5 }; 
var y6 = { name: '6', index: 6 }; 
var y7 = { name: '7', index: 7 }; 
var y8 = { name: '8', index: 8 }; 
var boardArray = [ 
    [ y1, y2, y3, y4, y5, y6, y7, y8], 
    [ y1, y2, y3, y4, y5, y6, y7, y8], 
    [ y1, y2, y3, y4, y5, y6, y7, y8], 
    [ y1, y2, y3, y4, y5, y6, y7, y8], 
    [ y1, y2, y3, y4, y5, y6, y7, y8], 
    [ y1, y2, y3, y4, y5, y6, y7, y8], 
    [ y1, y2, y3, y4, y5, y6, y7, y8], 
    [ y1, y2, y3, y4, y5, y6, y7, y8] 
]; 

:

var boardArray = Array(...Array(...XPOSITIONS)).map(() => Array(...YPOSITIONS)); 

eşdeğerdir. Yani bunu yaptığında anlamı:

boardArray[xindex][yindex].name = x.name.concat(y.name); 

her sütunda bu nesne için .name değiştiriyoruz. Yani boardArray[0][0].name'u değiştirdiğinizde, boardArray[1][0].name, boardArray[2][0].name, boardArray[3][0].name, vb. Değiştirirsiniz. Bu durumda, işlevinizden geri dönmeden önce bir console.dir(boardArray) ekleyerek doğrulayabilirsiniz ve içeriğin tamamen aynı olduğunu göreceksiniz.

Ayrıca const nesne üzerinde özelliklerini değiştirmeyecek anlamına gelmez, sadece bir kez yapılabilmesidir değişken bir atama anlamına gelir.

+0

Atama ile ilgili bir sorun olduğuna inanıyorum boardArray [xindex] [yindex] .name = x.name.concat (y.name); 'çünkü bu satırı açıkladığımda ve sadece konsolun' konsol.log'unu (x.name.concat (y.name)) belirlediğimde; sonuç istediğim gibi, ancak bu ödev anlayamadığım bir şey yapıyor . Detaylandırır mısın? –

+0

Son cevaplarınızı dikkatlice okuduktan sonra anladım, teşekkürler! –