Lodash /下划线:将对象数组转换为单个对象

时间:2015-09-03 00:59:57

标签: javascript underscore.js lodash

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

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

我想将A转换为对象:

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

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

6 个答案:

答案 0 :(得分:7)

你真的不需要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 :(得分:3)

可能有一种我无法找到的内置方式,但是:

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

答案 2 :(得分:1)

我这样做:

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

清晰简单。

答案 3 :(得分:1)

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

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

输出:

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

在花了一些时间寻找同一问题的lodash解决方案(并没有找到任何问题)之后,我想出了这个小帮手函数:

// Array<{}> => {}; ie.: [{ a: 1, }, { b: 2 }] => { a: 1, b: 2 }
export const objectsListToMergedObject = (...objectsList) =>
    Object.assign({}, ...objectsList);