[英]How to create a multidimensional array with an object as default value in Javascript?
我想创建多维数组时遇到麻烦。
我不知道为什么,但是当我想创建一个以对象作为默认值的多维数组时,我得到一个奇怪的行为。
我使用了不同的方式,例如:
当我想更改对象字段的任何一个时,都会出现问题。
function matrix( rows, cols, defaultValue){ var arr = []; // Creates all lines: for(var i=0; i < rows; i++){ // Creates an empty line arr.push([]); // Adds cols to the empty line: arr[i].push( new Array(cols)); for(var j=0; j < cols; j++){ // Initializes: arr[i][j] = defaultValue; } } return arr; } var myArray = matrix(5, 5, { status: 'OK' }); myArray[2][1].status = 'NOT OK'; console.log('Strange behavior', myArray);
更改扩展到其他位置。
有谁能够帮助我?
因为您一遍又一遍地存储对一个相同对象的引用,所以您具有所描述的行为。 要获取单独的对象,可以在每次需要时使用object.assign
来创建defaultValue的(浅)副本:
arr[i][j] = Object.assign({}, defaultValue);
使用其他一些ES6功能,您的代码可能如下所示:
function matrix( rows, cols, defaultValue){ return Array.from(Array(rows), row => Array.from(Array(cols), cell => Object.assign({}, defaultValue)) ); } var myArray = matrix(5, 5, { status: 'OK' }); myArray[2][1].status = 'NOT OK'; console.log('Correct behavior', myArray);
.as-console-wrapper { max-height: 100% !important; top: 0; }
问题是您要在矩阵的每个点分配相同的对象。 因此,如果在数组的某一点更改对象,则在所有其他点也将更改。 要解决此问题,请使用克隆函数(例如下划线或jQuery的)或为矩阵中的每个点实例化一个新对象。
代替
arr.push([]);
// Adds cols to the empty line:
arr[i].push( new Array(cols));
尝试
arr.push( new Array(cols));
对象通过它们的引用传递,因此您要为矩阵中的所有单元格分配对同一对象的引用,从而使它们成为同一对象(更改一个对象也会导致其他对象也发生更改)。 您必须复制对象。 如果您正在使用最新的ECMAScript,则可以使用Object.assign
如下所示:
function matrix( rows, cols, defaultValue) {
var arr = [];
for(var i=0; i < rows; i++) {
var row = []; // create a row
arr.push(row); // push it into the matrix
for(var j=0; j < cols; j++) {
row[j] = Object.assign({}, defaultValue); // copy the default value and assign it to this cell
}
}
return arr;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.