Lodash/underscore:将对象数组转换为单个对象

5

我有一个对象数组,长得像这样:

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

我希望将A转换为一个对象:

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

这种情况从未出现过,但我在考虑使用mapKeysmapValues,但感觉有更简单的答案。谢谢!

5个回答

9
你不一定需要使用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}]);

1
我正在点赞你的回答,因为我喜欢使用本地的 Array.prototype.reduce,但 @minitech 使用了 lodash 回答,所以我接受了他/她的回答。 - ShaharZ
明白了。感谢您花时间解释。 - kennasoft
可能应该返回newObject,或者只需返回 return arraySrc.reduce(...);。;-) - RobG
@RobG 没错。我会更新函数以返回计算出的值... - kennasoft
@ShaharZ:如果你需要一种Underscore/lodash的方法,你可以用_.reduce替换Array.prototype.reduce - mu is too short

4
最好的方法是使用 _.extend。
let list = [{"foo":"bar"},{"baz":"faz"},{"label":"Hello, World!"}];
let singleObject = _.extend.apply({}, list);

输出:

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

4
我会这样做:
var result = _(A).keyBy('key').mapValues('val').value();

清晰简明。

3

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

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

2

也许有一种内置的方式我找不到,但是:

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

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