我想知道在lodash中是否有一个更简单的方法来替换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); } };
dfsq.. 170
在您的情况下,您需要做的就是在数组中查找对象并使用Array.prototype.splice
方法:
var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}];
// Find item index using _.findIndex (thanks @AJ Richardson for comment)
var index = _.findIndex(arr, {id: 1});
// Replace item at index using native splice
arr.splice(index, 1, {id: 100, name: 'New object.'});
// "console.log" result
document.write(JSON.stringify( arr ));
您还可以使用findIndex和pick来实现相同的结果:
var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}]; var data = {id: 2, name: 'Person 2 (updated)'}; var index = _.findIndex(arr, _.pick(data, 'id')); if( index !== -1) { arr.splice(index, 1, data); } else { arr.push(data); }
在您的情况下,您需要做的就是在数组中查找对象并使用Array.prototype.splice
方法:
var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}];
// Find item index using _.findIndex (thanks @AJ Richardson for comment)
var index = _.findIndex(arr, {id: 1});
// Replace item at index using native splice
arr.splice(index, 1, {id: 100, name: 'New object.'});
// "console.log" result
document.write(JSON.stringify( arr ));
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"></script>
[ES6]此代码适用于我.
let result = array.map(item => item.id === updatedItem.id ? updatedItem : item)
随着时间的流逝,您应该采用一种更具功能性的方法,在这种方法中,您应该避免数据突变并编写小的,单一责任的函数。与ECMAScript 6个标准,你可以在JavaScript中享受函数式编程范式与所提供的map
,filter
和reduce
方法。您不需要其他破折号,下划线或其他可以执行大多数基本操作的内容。
下面,我提供了一些针对此问题的建议解决方案,以展示如何使用不同的语言功能来解决此问题:
使用ES6地图:
const replace = predicate => replacement => element =>
predicate(element) ? replacement : element
const arr = [ { id: 1, name: "Person 1" }, { id:2, name:"Person 2" } ];
const predicate = element => element.id === 1
const replacement = { id: 100, name: 'New object.' }
const result = arr.map(replace (predicate) (replacement))
console.log(result)
似乎最简单的解决方案是使用ES6 .map
或lodash _.map
:
var arr = [{id: 1, name: "Person 1"}, {id: 2, name: "Person 2"}]; // lodash var newArr = _.map(arr, function(a) { return a.id === 1 ? {id: 1, name: "Person New Name"} : a; }); // ES6 var newArr = arr.map(function(a) { return a.id === 1 ? {id: 1, name: "Person New Name"} : a; });
这具有避免改变原始数组的良好效果.