[英]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
。
另外,我還沒有突變原始對象。 如果那是您想做的事情,那么您可以這樣做。 但是通常,您不使用這些功能( map
, filter
, reduce
)來變異數據。
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.