ฉันสงสัยว่ามีวิธีที่ง่ายกว่าในการแทนที่รายการในคอลเลกชัน JavaScript หรือไม่? (อาจซ้ำกันได้แต่ฉันไม่เข้าใจคำตอบที่นั่น :)
ฉันดูเอกสารของพวกเขา แต่ไม่พบอะไรเลย
รหัสของฉันคือ:
var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}];
// Can following code be reduced to something like _.XX(arr, {id:1}, {id:1, name: "New Name"});
_.each(arr, function(a, idx){
if(a.id === 1){
arr[idx] = {id:1, name: "Person New Name"};
return false;
}
});
_.each(arr, function(a){
document.write(a.name);
});
อัปเดต: วัตถุที่ฉันพยายามแทนที่มีคุณสมบัติมากมายเช่น
{id: 1, Prop1: ... , Prop2: ... และอื่น ๆ }
สารละลาย:
ขอบคุณdfsqแต่ฉันพบวิธีแก้ปัญหาที่เหมาะสมภายใน lodash ซึ่งดูเหมือนว่าจะทำงานได้ดีและค่อนข้างเรียบร้อยและฉันก็ใส่ไว้ใน mixin เช่นกันเนื่องจากฉันมีข้อกำหนดนี้ในหลาย ๆ ที่ JSBin
var update = function(arr, key, newval) {
var match = _.find(arr, key);
if(match)
_.merge(match, newval);
else
arr.push(newval);
};
_.mixin({ '$update': update });
var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}];
_.$update(arr, {id:1}, {id:1, name: "New Val"});
document.write(JSON.stringify(arr));
โซลูชันที่เร็วขึ้น ตามที่ระบุไว้โดย @dfsq วิธีต่อไปนี้เร็วกว่า
var upsert = function (arr, key, newval) {
var match = _.find(arr, key);
if(match){
var index = _.indexOf(arr, _.find(arr, key));
arr.splice(index, 1, newval);
} else {
arr.push(newval);
}
};
_.findIndex
สำหรับการแข่งขัน
_.findIndex
แทน_.find
จะช่วยให้คุณทิ้งทั้งสอง_.find
และ_.indexOf
. คุณกำลังวนซ้ำอาร์เรย์ 3 ครั้งเมื่อสิ่งที่คุณต้องการคือ 1