8

オブジェクトがある場合:

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」のみを「変更された名前」に設定しようとしているにもかかわらず、array[0].song も「変更された名前」に設定されるという問題があります。

私が望むのは、「theobject.song」が「変更された名前」になり、array[0].song が「The Song」のままになることです。

これを達成するための最良の方法は何ですか?

4

2 に答える 2

8

ループ内でオブジェクトへの参照を取得することはありません。試す:

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

songこれにより、オブジェクトへの参照が提供され、objectsプロパティを変更できるようになります。

オブジェクトのコピーを使用する場合は、手動でコピーする必要があります。例えば

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;
}
于 2012-05-09T05:01:50.507 に答える