【问题标题】:Lodash: How to add new field to all values in collectionLodash:如何将新字段添加到集合中的所有值
【发布时间】:2013-11-26 21:06:29
【问题描述】:

例子:

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 做到这一点吗?
如果没有 - 可能添加?

谢谢,

【问题讨论】:

  • newArr 是否打算成为一个包含全新对象的全新数组?即 arr 是否应该保持不变?

标签: javascript underscore.js lodash


【解决方案1】:

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


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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • arr.map() 的目的是返回一个新数组。在这里,您没有返回新数组,而是在改变 arr ... 那么为什么不使用 arr.forEach() 代替呢? ` arr.forEach((element) => { element.married = false }) `
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        lodash 最接近你想要的功能是合并:http://lodash.com/docs#merge

        合并的工作方式与您想要做的事情之间唯一的细微差别是您需要一个长度相等的数组来 arr all 看起来像:

        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 一样工作。

        【讨论】:

          【解决方案6】:

          你可能想extendeach你的对象。

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

          【讨论】:

          • 您正在就地修改arr,而lodash的each将返回arr,因此newArr具有误导性;你根本不需要_.extend,你可以用function(e) { e.married = false } (jsfiddle.net/ambiguous/8c7ch) 做同样的事情。如果您打算复制,那么您需要使用_.map_.extend({}, element, { married: false })
          • @muistooshort 好点;更新的答案。我保留了extend,因为如果您想添加多个字段或已经将扩展名保存为对象,我认为这是一个更好的通用解决方案。 (我也很累,所以如果我错过了其他内容,请随时编辑。)
          • 谢谢大家!使用回调函数很容易做到这一点。但是这个问题的目的是检查是否可以在没有它的情况下完成。如果没有这样的功能,是否值得添加到lib中?
          • 我不反对回调。他们是自然的。我只是在寻找一些速记版本。
          • 它就像一个魅力,感谢@Mathletics,现在该方法被称为_.assign
          猜你喜欢
          • 2021-12-08
          • 1970-01-01
          • 2021-05-27
          • 1970-01-01
          • 1970-01-01
          • 2012-09-26
          • 2020-11-12
          • 2017-12-23
          • 2017-10-02
          相关资源
          最近更新 更多