【发布时间】:2016-10-05 12:22:45
【问题描述】:
我有一个包含扑克牌信息的数组 (cardInfo)。在下面的代码中添加了一个数组示例。由于每张卡可能有重复,我想使用此信息通过将其信息推送到该类型的每张卡(属性“frequency1”)的新数组(drawPile)来创建一个套牌。
var common = 4;
var uncommon = 3;
var rare = 2;
var cardInfo = [
{name:'Card A',frequency1:common,frequency2:rare,frequency3:0},
{name:'Card B',frequency1:common,frequency2:uncommon,frequency3:0},
{name:'Card C',frequency1:uncommon,frequency2:uncommon,frequency3:0}
];
var drawPile = [];
for (var cType = 0; cType < cardInfo.length; cType++) {
for (var freq = 0; freq < cardInfo[cType].frequency1; freq++) {
drawPile.push(cardInfo[cType]);
console.log(drawPile.length - 1);
drawPile[(drawPile.length - 1)].id = (drawPile.length - 1);
console.log(drawPile[(drawPile.length - 1)]);
}
}
然而,生成的控制台日志显示所有 4 张“卡 A”卡的 id 属性为 3,所有 4 张“卡 B”卡的 id 属性为 7,所有 3 张“卡 C”卡的 id 属性10. 就好像嵌套 (freq) 循环只对所有 .push() 命令运行,然后才添加 id 属性。
更奇怪的是:当我在jsfiddle 中运行此代码时,如果我先运行它然后打开控制台日志,我可以复制这些结果,但是当我在控制台 lof 已经打开后运行它时,它按预期工作.
如何确保每张卡都有唯一的标识符?
编辑:如果我创建一个全新的 for 循环专门用于添加 this code 中看到的 id 属性,当我得到完全相同的结果时,它会变得更加奇怪。
【问题讨论】:
-
@Gavin,这很奇怪。这是我第一次运行时的结果,稍后打开控制台:oi67.tinypic.com/2r2ureb.jpg
-
"所有 4 张“卡 A”卡的 id 属性为 3" - 当然有。它们都是同一个对象。您需要在循环中创建新对象以赋予它们不同的属性值。赋值不会复制对象。
-
@Bergi 每次将其推送到 drawPile 数组时,我不是都在创建一个新对象(尽管具有相同的属性和值)吗?
-
不,你是在不断地推送对同一个对象的新引用。
-
那么我该怎么做才能得到一个 drawPIle 数组,其中每个索引都包含一个具有唯一 id 属性的对象?
标签: javascript arrays object for-loop