如果我有一个对象:
var array = [];
var theobject = null;
array.push({song:"The Song", artist:"The Artist"}, {song:"Another Song", artist:"Another Artist"});
我做了:
for(var i = 0; i < array.length; i++)
if(array[i].song == "The Song") {
theobject = array[i];
break;
}
如果我然后通过执行以下操作来更改对象:
theobject.song = "Changed Name";
我遇到问题,尽管我自己试图将“theobject.song”设置为等于“Changed Name”,但数组[0] .song也设置为“Changed Name”。
我想要的是“theobject.song”变为“Changed Name”而array [0] .song仍为“The Song”。
实现这一目标的最佳方法是什么?
答案 0 :(得分:7)
您永远不会在循环中获得对象的引用。尝试:
for(var i = 0; i < array.length; i++)
if(array[i].song === "The Song") {
theobject = array[i];
break;
}
这将提供对象的引用,您将能够更改对象song
属性。
如果要使用对象的副本,则必须进行手动复制。 E.g。
function clone(obj) {
var copy = {};
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) {
copy[attr] = obj[attr];
}
}
return copy;
}
你的循环变为:
for(var i = 0; i < array.length; i++)
if(array[i].song === "The Song") {
theobject = clone(array[i]);
break;
}
答案 1 :(得分:1)
可以使用Object.assign()仅复制其值而不引用。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
var array = [];
var theobject = null;
array.push({
song:"The Song",
artist:"The Artist"
},
{
song:"Another Song",
artist:"Another Artist"
});
for(var i = 0; i < array.length; i++)
if(array[i].song == "The Song") {
theobject = Object.assign( {}, array[i] );
break;
}
theobject.song = "Changed Name";
console.log( array );
console.log( theobject );