簡體   English   中英

JavaScript數組項被覆蓋

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM