[英]Javascript array item overwritten
我有以下代碼。
代碼遍歷jsonRow對象的集合,將它們壓入jsonRows數組,然后按屬性重置jsonRow對象。
此重置導致jsonRows數組中的jsonRow對象受到影響。 有關此行為的任何線索?
for(iterating over collection of jsonRow objects){
if(0 < jsonRow.id.length && 0 < jsonRow.title.length){
jsonRows.push(jsonRow);
console.log('jsonRow in jsonRows is intact', jsonRows);
for(var prop in jsonRow){
jsonRow[prop] = '';
}
console.log('jsonRow properties in jsonRows are ""', jsonRows);
}
}
jsonRows
的對象與您“重置”的對象相同。 Javascript通過引用傳遞參數 。 如果您不希望更改反映在您放入數組的對象中,則需要克隆這些對象。
例如:
for(iterating over collection of jsonRow objects){
if(0 < jsonRow.id.length && 0 < jsonRow.title.length){
jsonRows.push(Object.assign({}, jsonRow));
console.log('jsonRow in jsonRows is intact', jsonRows);
for(var prop in jsonRow){
jsonRow[prop] = '';
}
console.log('jsonRow properties in jsonRows are ""', jsonRows);
}
}
這是因為您在數組中推送了JSON對象的引用。 如果現在更改指向同一引用的JSON對象,則指向該引用的所有內容都將具有新值。 您必須復制JSON對象,然后將其推入數組,然后該對象具有新的引用。
想要一個新對象?
if(!Object.create){
Object.create = function(obj){
function F(){}; F.prototype = obj;
return new F;
}
}
var newObj = Object.create(oldObj);
// now use your loop
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.