2012-05-09 33 views
3

如果我有一个对象:JavaScript对象引用链接到数组中的对象?

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:

theobject.song = "Changed Name"; 

我有问题在那里,尽管自己努力只设置“theobject.song”等于“更改名称”,数组[0] .song也设置为“更改名称”。

我要的是“theobject.song”成为“更名”,而数组[0]。宋仍然是“歌”。

完成此操作的最佳方法是什么?

+3

你为什么不只是尝试一下 – blockhead

回答

7

你将永远不会在循环将对象的引用。请尝试:

for(var i = 0; i < array.length; i++) 
if(array[i].song === "The Song") { 
theobject = array[i]; 
break; 
} 

这会给对象的引用,并且您将能够更改对象song属性。

如果你想使用对象的副本,那么你就必须做一个手动复制。例如。

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; 
} 
+0

我不想refrence,我要一个副本。我想更改只有theobject的歌曲属性,而不是原始数组。 – Rolando

+0

看到编辑答案 – KooiInc

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