我的循环将所有值更改为最后一个元素

时间:2018-05-06 20:13:21

标签: javascript

为什么我的for循环会将数组的所有值更改为相同的东西?

for (var i = 0; i < arr.length; i++) {
    arr[i] = otherarr[i];
}

它将arr中的所有值更改为otherarr完成时的最后一个元素。 它们的长度相同。 我是编程新手,有人可以帮帮我吗?

我正在制作骑士之旅,当我按下按钮时,我想让它显示完成它的可能方法。

var rightmoves = ["e8", "g7", "h5", "f6", "e4", "g3", "h1", "f2", "d1", "b2", "a4", "c3", "d5", "b6", "a8", "c7", "b5", "a7", "c8", "d6", "c4", "a3", "b1", "d2", "f1", "h2", "g4", "e3", "f5", "h6", "g8", "e7", "c6", "d8", "b7", "a5", "b3", "a1", "c2", "d4", "f3", "e1", "g2", "h4", "g6", "h8", "f7", "g5", "h7", "f8", "e6", "f4", "h3", "g1", "e2", "c1", "a2", "b4", "d3", "c5", "a6", "b8", "d7", "e5"];
for (var i = 0; i < rightmoves.length; i++) {
    moves[i] = knight;
    moves[i].row = rightmoves[i].charAt(1);
    console.log(moves[i].row)
}

knight具有类似于棋盘上的行和col的属性,并且移动存储它所做的移动。 当我在chrome中查看控制台中的移动时,移动有64个对象,它们都具有相同的行值,但是控制台日志会将行的所有正确值都放入。

1 个答案:

答案 0 :(得分:1)

您正在将相同的对象引用knight推送到每个数组索引中。

尝试使用Object#assign()来推送浅拷贝,以便在数组的每个索引中都有唯一的对象

for (var i = 0; i < rightmoves.length; i++) {
    moves[i] = Object.assign({},knight);// shallow copy of knight object
    moves[i].row = rightmoves[i].charAt(1);
    console.log(moves[i].row)
}