简体   繁体   English

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

[英]Lodash/underscore: Convert array of objects to single object

I have an array of objects that looks like so:我有一个看起来像这样的对象数组:

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

And I want to transform A to an object:我想将A转换为一个对象:

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

This usecase has never come up, but I was thinking of doing mapKeys and then mapValues and I feel there's a simpler answer.这个用例从来没有出现过,但我正在考虑mapKeys然后是mapValues ,我觉得有一个更简单的答案。 Thanks!谢谢!

You don't really need lodash to achieve that.你真的不需要 lodash 来实现这一点。 Just do this with array.reduce() .只需使用array.reduce() 即可 See code sample below:请参阅下面的代码示例:

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

There may be a built-in way that I can't find, but:可能有我找不到的内置方式,但是:

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

I'd do this:我会这样做:

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

Clear and simple.清晰而简单。

Updating @ry answer to a newer version of lodash:将 @ry 答案更新为较新版本的 lodash:

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

After spending some time looking for a lodash solution for this same problem (and not finding any), I came up with this small helper function: 花了一些时间为同样的问题寻找一个lodash解决方案(并没有找到任何问题),我想出了这个小帮手功能:

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

The best way is to use _.extend.最好的方法是使用 _.extend。

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

Output:输出:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM