为了账号安全,请及时绑定邮箱和手机立即绑定

Array.fill(Array)通过引用创建副本,而不是通过值创建副本

Array.fill(Array)通过引用创建副本,而不是通过值创建副本

慕雪6442864 2019-12-06 09:28:02
我正在尝试使用创建6 x 12矩阵 Array.filllet m = Array(6).fill(Array(12).fill(0));虽然这样做有效,但问题是内部数组实际上都引用同一Array对象。let m = Array(6).fill(Array(12).fill(0));m[0][0] = 1;console.log(m[1][0]); // Outputs 1 instead of 0我想(和预期)的值m[1][0]是0。如何强制Array.fill填充给定参数的按值复制(例如Array(12).fill(0),在我的情况下是该参数),而不是按引用复制?
查看完整描述

3 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

您可以使用Array.from()代替:


感谢Pranav C Balan在评论中提出的关于进一步改善此问题的建议。


let m = Array.from({length: 6}, e => Array(12).fill(0));


m[0][0] = 1;

console.log(m[0][0]); // Expecting 1

console.log(m[0][1]); // Expecting 0

console.log(m[1][0]); // Expecting 0


查看完整回答
反对 回复 2019-12-06
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

您无法使用进行此操作.fill(),但可以使用.map():


let m = new Array(6).map(function() { return new Array(12); });

编辑哦,等等,这是行不通的;.map()不会遍历未初始化的元素。您可以先填写:


let m = new Array(6).fill(null).map(function() { return new Array(12); });


查看完整回答
反对 回复 2019-12-06
?
森林海

TA贡献2011条经验 获得超2个赞

你不能用Array#fill方法做到这一点。而是遍历数组,并使用for循环添加新创建的数组。


let m = Array(6);

for (var i = 0; i < m.length; i++)

  m[i] = Array(12).fill(0)


m[0][0] = 1;

console.log(m[1][0]);


查看完整回答
反对 回复 2019-12-06
  • 3 回答
  • 0 关注
  • 342 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信