簡體   English   中英

如何用for循環修改對象鍵更具聲明性?

[英]How to be more declarative with for loop modify object key?

我想搜索現有對象並修改其屬性。 這很好用:

function changeObjectKey(targetObject) {
       for(var i = 0; i < listofobjects.length; i++) {
          if(targetobject.keyone == listofobjects[i].keyone) 
            listofobjects[i].keytwo = 'changedvalue';
            break;
          }
        }
}

我想使用過濾器使其更智能,該怎么做? 我試過了:

function changeObjectKey(targetObject) {
let filteredobject = listofobjects.filter(function(currentobject) {
return (currentobject.keyone == targetobject.keyone);
 });
filteredobject.keytwo = 'changedvalue';

}

注意:過濾器中將僅匹配一個對象。 盡管后者不會更改listofobjects.keytwo ...,但我認為是它的一個副本。 而在第一種情況下,原始對象[i] .keytwo的列表將被更改。

正確的方法是什么?

只需取第一個[0]

let filteredobject = listofobjects.filter(function(currentobject) {
return (currentobject.keyone == targetobject.keyone);
 })[0];
filteredobject.keytwo = 'changedvalue';

我想map會更適合這個。 當然,您可以在filter之后鏈接map

另外,我還沒有突變原始對象。 如果那是您想做的事情,那么您可以這樣做。 但是通常,您不使用這些功能( mapfilterreduce )來變異數據。

function changeObjectKey(targetObject) {
  return listofobjects.map(function (obj) {
    if (obj.keyone !== targetobject.keyone) {
      return obj;
    }

    return Object.assign({}, obj, {
      keytwo = 'changedvalue'
    })
  })
}

我認為更好的map()方法。

map()方法創建一個新數組,並對該數組中的每個元素調用提供的函數。

  listofobjects = listofobjects.map(function(currentobject) {
       if(currentobject.keyone === targetobject.keyone){
             currentobject.keytwo = "changed value";
       }
  });

結果是相同的數組,但是現在tarjetobjec的keytwo已更改其值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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