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);
}
};
_.findIndexcho phù hợp.
_.findIndexthay vì _.findsẽ cho phép bạn bỏ cả thứ hai _.findvà 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.