Tôi tự hỏi nếu có một phương pháp đơn giản hơn trong lodash để thay thế một mục trong bộ sưu tập JavaScript? (Có thể trùng lặp nhưng tôi không hiểu câu trả lời ở đó :)
Tôi đã xem tài liệu của họ nhưng không tìm thấy gì
Mã của tôi là:
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);
});
Cập nhật: Đối tượng tôi đang cố gắng thay thế có nhiều thuộc tính như
{id: 1, Prop1: ..., Prop2: ..., v.v.
Giải pháp:
Cảm ơn dfsq nhưng tôi đã tìm thấy một giải pháp thích hợp trong lodash có vẻ hoạt động tốt và khá gọn gàng và tôi cũng đưa nó vào một mixin vì tôi yêu cầu này ở nhiều nơi. Mã não
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));
Giải pháp nhanh hơn Như được chỉ ra bởi @dfsq, sau đây là cách nhanh hơn
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
cho phù hợp.
_.findIndex
thay vì _.find
sẽ cho phép bạn bỏ cả thứ hai _.find
và thứ hai _.indexOf
. Bạn đang lặp lại qua mảng 3 lần khi tất cả những gì bạn cần là 1.