Lodash:如何向集合中的所有值添加新字段

Lodash: How to add new field to all values in collection

本文关键字:新字段 添加 字段 集合 Lodash      更新时间:2023-09-26

示例:

var arr = [{name: 'a', age: 23}, {name: 'b', age: 24}]  
var newArr = _.enhance(arr, { married : false });
console.log(newArr); // [{name: 'a', age: 23, married : false}, {name: 'b', age: 24, married : false}]

我正在寻找一些东西来做到这一点。请注意,增强在洛达什中不存在。可以用洛达什做到这一点吗?
如果不是 - 可能添加?

谢谢

你可能想要extend each你的对象。

Mu太短了,有点扼杀了我的文字游戏,同时提出了一个很好的观点。更新以创建一个全新的阵列。

var arr = [{name: 'a', age: 23}, {name: 'b', age: 24}];
var newArr = _.map(arr, function(element) { 
     return _.extend({}, element, {married: false});
});

如果要将其添加到库中,

_.enhance = function(list, source) {
    return _.map(list, function(element) { return _.extend({}, element, source); });   
}

使用 lodash 和 ES6 箭头符号,解决方案可能会变得非常短:

const newArr = _.map(arr, o => _.extend({married: false}, o));

注意:我使用对象{married: false}作为第一个参数,因为改变这个对象会使原始数组保持不变。但是,这意味着married成为结果对象中的第一个字段,但这可能无关紧要。

我使用 ES6 语法。我认为这对你有帮助。

var arr = [{name: 'a', age: 23}, {name: 'b', age: 24}];    
arr.map((element) => {
   return element.married = false;
});
console.log(arr); // [{name: 'a', age: 23, married : false}, {name: 'b', age: 24, married : false}] 

ES6 with Map and Spread

const arr = [{name: 'a', age: 23}, {name: 'b', age: 24}, {name: 'c', age: 25}];
const newArr = arr.map(el => ({ ...el, married: false }));
console.log(newArr);  
// [{age: 23, married: false, name: 'a'}, {age: 24, married: false, name: 'b'}, {name: 'c', age: 25, married: false}]


注意:重新定义对象文字的箭头函数需要用括号将对象括起来,例如() => ({})

lodash 最接近你想要的函数是 merge: http://lodash.com/docs#merge

合并的工作方式和您想要执行的操作之间的唯一细微区别是,您需要有一个相同长度的数组来arr所有看起来像:

var arr = [{name: 'a', age: 23}, {name: 'b', age: 24}];
var marriedArr = [{married : false}, {married : false}];
var newArr = _.merge(arr, marriedArr);
console.log(newArr);

如果您尝试执行以下操作:

var newArr = _.merge(arr, {married : false});

然后合并将像 concat 一样工作。

这来得晚了,它不涉及 lodash,但我认为如果您希望旧数据可变,最干净的解决方案是使用经典的 for 循环迭代。这样,您就不会用新阵列加载内存。