使用JavaScript在特定索引处填充二维数组中的数组

时间:2016-06-04 09:47:59

标签: javascript arrays

我想用特定索引处的项填充二维数组的内部数组。在这种情况下的问题是每个内部数组都填充了这些项目。

尝试:link_to_code_img

结果:link_to_result_img

代码:

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的数组。我做错了什么?

3 个答案:

答案 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);