【问题标题】:Lodash/underscore: Convert array of objects to single objectLodash/下划线:将对象数组转换为单个对象
【发布时间】:2015-09-03 00:59:57
【问题描述】:

我有一个看起来像这样的对象数组:

var A = [{key:"key1",val:1},{key:"key2",val:2},...,{key:"keyn",val:n}]

我想将A 转换为一个对象:

{
    key1: 1,
    key2: 2,
    ...
    keyn: n
}

这个用例从来没有出现过,但我想先做mapKeys,然后再做mapValues,我觉得有一个更简单的答案。谢谢!

【问题讨论】:

    标签: javascript underscore.js lodash


    【解决方案1】:

    您实际上并不需要 lodash 来实现这一点。只需使用array.reduce() 即可。请参阅下面的代码示例:

    function transformArray(arraySrc){
        return arraySrc.reduce(function(prev, curr){
            prev[curr.key] = curr.val;
            return prev;
        }, {});
    }
    
    transformArray([{key:"key1",val:1},{key:"key2",val:2},{key:"key3",val:3}]);
    

    【讨论】:

    • 我赞成你的回答,因为我喜欢使用原生 Array.prototype.reduce,但 @minitech 使用 lodash 回答,所以我接受他/她的回答
    • 明白了。感谢您花时间解释
    • 可能应该返回 newObject,或者只是 return arraySrc.reduce(...);。 ;-)
    • @RobG 你是对的。我将更新函数以返回计算值...
    • @ShaharZ:如果您需要下划线/lodash 方法,可以将Array.prototype.reduce 替换为_.reduce
    【解决方案2】:

    可能有一个我找不到的内置方式,但是:

    var result = _.zipObject(
        _.pluck(A, 'key'),
        _.pluck(A, 'val')
    );
    

    【讨论】:

      【解决方案3】:

      我会这样做:

      var result = _(A).keyBy('key').mapValues('val').value();
      

      简洁明了。

      【讨论】:

        【解决方案4】:

        将@ry 答案更新为较新版本的lodash:

        var result = _.zipObject(
            _.map(A, 'key'),
            _.map(A, 'val')
        );
        

        【讨论】:

          【解决方案5】:

          最好的方法是使用_.extend。

          let list = [{"foo":"bar"},{"baz":"faz"},{"label":"Hello, World!"}];
          let singleObject = _.extend.apply({}, list);
          

          输出:

          {foo: "bar", baz: "faz", label: "Hello, World!"}
          

          【讨论】:

            猜你喜欢
            • 2018-05-22
            • 2015-10-05
            • 1970-01-01
            • 1970-01-01
            • 2016-08-06
            • 1970-01-01
            • 2019-04-18
            • 1970-01-01
            • 2019-02-12
            相关资源
            最近更新 更多