Lodash:如何将新字段添加到集合中所有值?

38

例子:

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}]

我正在寻找今天要做的事情。注意,enhance在lodash中不存在。 是否可能使用lodash来完成此操作?
如果不行 - 有可能添加吗?

谢谢,


2
newArr是指一个全新的数组,其中包含全新的对象吗?也就是说,arr应该保持不变吗? - mu is too short
6个回答

56

您可能想要扩展您的每个对象。

mu is too short 排序方式在表达出一个很好的观点的同时,也破坏了我的文字游戏。更新为创建一个全新的数组。

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); });   
}

4
您在原地修改arr,lodash的each将返回arr,因此newArr是误导性的;您根本不需要使用_.extend,可以使用function(e) { e.married = false }来做同样的事情(http://jsfiddle.net/ambiguous/8c7ch/)。如果您想要复制,则应该使用`_.map`和`_.extend({}, element, { married: false })`。 - mu is too short
@muistooshort 说得好,已更新答案。我保留了 extend,因为我认为它是更好的通用解决方案,如果您想要添加多个字段或已将扩展保存为对象。 (我也非常疲倦,如果我错过了其他内容,请随意编辑。) - Evan Davis
谢谢大家!使用回调函数很容易实现这个功能。但是这个问题的目的是检查是否可以在没有回调函数的情况下完成。如果没有这样的函数,将其添加到库中是否值得? - sowdri
1
我不反对回调函数。它们很自然。我只是在寻找一些简写的方式来实现它。 - sowdri
1
它像魔法一样运行,感谢@Mathletics,现在该方法被称为_.assign。 - luis19mx
显示剩余4条评论

16

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

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

注意:我使用对象{married: false}作为第一个参数,因为改变此对象不会影响原始数组。这意味着married成为结果对象中的第一个字段,但这可能并不重要。


16

我使用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}] 

9
arr.map()的目的是返回一个新数组。在这里,你没有返回一个新数组,而是改变了arr的值……那么为什么不使用arr.forEach()呢?arr.forEach((element) => { element.married = false }) - Tremendus Apps

7

使用ES6的 MapSpread 进行开发

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}]

注意:返回对象字面量的箭头函数需要用括号将对象包裹起来,例如,() => ({})

1

您所需要的最接近的lodash函数是merge:http://lodash.com/docs#merge

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});

然后合并将像连接一样工作。

-3

这个方案来得有点晚,而且不涉及lodash,但是如果你想要旧数据可变的最干净的解决方案,我认为使用经典的for循环迭代是最好的。这样你就不会用一个新数组来占用内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接