繁体   English   中英

lodash:将数组映射到对象

[英]lodash: mapping array to object

是否有内置的lodash函数来执行此操作:

var params = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];

并输出以下内容:

var output = {
    foo: 'bar',
    baz: 'zle'
};

现在,我只是在使用Array.prototype.reduce()

function toHash(array, keyName, valueName) {
    return array.reduce(function(dictionary, next) {
        dictionary[next[keyName]] = next[valueName];
        return dictionary;
    }, {});
}

toHash(params, 'name', 'input');

想知道是否有lodash捷径。

lodash的另一种方式4.17.2

_.chain(params)
    .keyBy('name')
    .mapValues('input')
    .value();

要么

_.mapValues(_.keyBy(params, 'name'), 'input')

或使用_.reduce

_.reduce(
    params,
    (acc, { name, input }) => ({ ...acc, [name]: input }),
    {}
)

您应该使用_.keyBy轻松将数组转换为对象。

文件在这里

用法示例如下:

 var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; console.log(_.keyBy(params, 'name')); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script> 

如果需要,可以在使用_.keyBy之前操纵数组,或者在使用_.keyBy之后操纵对象以获得确切的所需结果。

是的, 在这里 ,使用_.reduce

var params = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];

_.reduce(params , function(obj,param) {
 obj[param.name] = param.input
 return obj;
}, {});

您可以使用一种带有数组减少方法和ES6分解的线性JavaScript,将键值对数组转换为对象。

arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});

这似乎是Object.assign的工作:

const output = Object.assign({}, ...params.map(p => ({[p.name]: p.input})));

编辑为包装成类似于OP的功能,这将是:

const toHash = (array, keyName, valueName) => 
    Object.assign({}, ...array.map(o => ({[o[keyName]]: o[valueName]})));

(感谢Ben Steward,好主意...)

它也可以不使用像这样的lodash函数来解决:

let paramsVal = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];
let output = {};

paramsVal.forEach(({name, input})=>{
  output[name] = input;
})


console.log(output);

在此处输入图片说明

这可能比您想要的要冗长得多,但是您需要的是一个稍微复杂的操作,因此可能涉及到实际的代码(恐怖)。

我的建议是,使用zipObject非常合理:

_.zipObject(_.map(params, 'name'), _.map(params, 'input'));

使用fromPairs另一种选择,更hacky:

_.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));

匿名函数显示出骇人行为-我不相信JS可以保证对象迭代中元素的顺序,因此调用.values()不会。

Lodash的另一种方式

创建对,然后轻松地构建对象或ES6 Map

_(params).map(v=>[v.name, v.input]).fromPairs().value()

要么

_.fromPairs(params.map(v=>[v.name, v.input]))

这是一个有效的例子

 var params = [ { name: 'foo', input: 'bar' }, { name: 'baz', input: 'zle' } ]; var obj = _(params).map(v=>[v.name, v.input]).fromPairs().value(); console.log(obj); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script> 

暂无
暂无

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

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