我想用特定索引处的项填充二维数组的内部数组。在这种情况下的问题是每个内部数组都填充了这些项目。
代码:
Array.prototype.repeat= function(what, L){
while(L) this[--L]= what;
return this;
};
var yearsdays = [].repeat([], 365);
for(var i = 0; i<= yearsdays.length; i++){
if(i === 99) {
yearsdays[i].push(99)
}
}
结果:
Array[365]
[0 … 99]
0: Array[1]
0: 99
length: 1
__proto__: Array[0]
1: Array[1]
0: 99
length: 1
__proto__: Array[0]
2: Array[1]
0: 99
length: 1
__proto__: Array[0]
and etc.......
问题在于,因此,平日中的每个数组都填充了数字99,但不仅仅是我预期的索引为99的数组。我做错了什么?
答案 0 :(得分:2)
正如评论中所说的那样
你的内部数组都是彼此的引用
你可以像这样摆脱这个问题。它以某种方式克隆数组,因此引用不同。
Array.prototype.repeat= function(what, L){
while(L) this[--L]= what.slice(0); // <--- Here
return this;
};
答案 1 :(得分:0)
您将相同的数组传递给repeat
函数。所以它将是对单个数组的365个引用。
正确的方法是:
Array.prototype.repeat= function(L){
while(L) this[--L]= new Array();
return this;
};
答案 2 :(得分:0)
为了生成正确的2D数组,所有嵌套数组项都应该是唯一的。由于JS中的对象是引用类型,因此在JS中生成多维数组时必须要谨慎。创建多维数组的一种可能且通用的方法是:
Array.prototype.clone = function(){
return this.reduce((p,c,i) => (p[i] = Array.isArray(c) ? c.clone() : c, p),[])
}
function arrayND(...n){
return n.reduceRight((p,c) => c = (new Array(c)).fill(true).map(e => Array.isArray(p) ? p.clone() : p ));
}
yearsdays = arrayND(365,1,0);
yearsdays[6][0]="Sunday";
console.log(yearsdays);