将对象数组的内容分配给一个新数组

3

我试图将一个对象数组分配给另一个数组,但是当我创建新数组并在其他函数中更改其值时,原始数组也会发生变化(这是不好的)。我能用另一种方法吗?这是一个例子:http://codepen.io/Xiwi/pen/rLMbYp

3个回答

3

看起来你需要复制/克隆数组,这样它就不会被引用更改。

如果数组中只有原始类型,你可以像这样操作:

var test3 = JSON.parse(JSON.stringify(test2));

否则您需要使用递归解决方案,并且在问题描述中更加具体。
示例:

var test1 = [{name: 'test1'}];
var test2 = [{name: 'test2'}];
var test3 = JSON.parse(JSON.stringify(test2));

test3[0].name = 'test3';

// Open console
console.log('Test2: ',test2[0]); // Object {name: "test2"}
console.log('Test3: ',test3[0]); // Object {name: "test3"}


你不需要进行序列化,我相信 [].splice(0,0, arr); 可以复制基本类型。 - kirinthos
抱歉,[].concat(arr) - kirinthos
@kirinthos 不行。这样你会遇到同样的问题。在这里检查:https://jsfiddle.net/jbL0vm9m/ - Sergio
我说的是基本类型数组。 - kirinthos
@kirinthos,如果你指的是原始类型数组,那么你可以直接使用 var test3 = test2.slice(); 这样:https://jsfiddle.net/jbL0vm9m/1/ - Sergio

0

对象本质上是引用。您必须创建一个新对象并分配另一个对象的值:

var test3 = [ Object.assign({}, test2[0]) ];

0
使用简单的 `.map` 将一个对象数组复制到另一个数组中。
var test1 = [{name: 'test1'}];
var test2 = [{name: 'test2'}];
//var test3 = test2.slice(0); //doesn't work. objects are still references
var test3 = test2.map(function(obj){
  //return obj; //doesn't work. objects are still references
  var o={}; //create brand new object
  for(var prop in obj)
    o[prop]=obj[prop];//assign properties
  return  o;//works
});

test3[0].name = 'test3';

// Open console
console.log('Test2: ',test2[0]);
console.log('Test3: ',test3[0]);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接