lodash:将数组映射到对象

时间:2016-02-18 18:43:47

标签: javascript lodash

是否有内置的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捷径。

8 个答案:

答案 0 :(得分:67)

使用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 }),
    {}
)

答案 1 :(得分:25)

PHP extension,使用_.reduce

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

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

答案 2 :(得分:21)

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

Docs here

以下示例用法:



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>
&#13;
&#13;
&#13;

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

答案 3 :(得分:10)

您可以使用带有array reduce方法和ES6 destructuring的单行内容javascript将键值对的数组转换为对象。

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

答案 4 :(得分:3)

它也可以在不使用任何lodash函数的情况下解决:

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

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


console.log(output);

enter image description here

答案 5 :(得分:3)

这似乎是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,很好的思考...)

答案 6 :(得分:2)

这可能比你想要的更冗长,但是你要求稍微复杂的操作,因此可能涉及实际的代码(恐怖)。

我的建议,zipObject非常合乎逻辑:

validate, invalidate, paintComponent, paint

使用fromPairs

的另一种选择,更加hacky
_.zipObject(_.map(params, 'name'), _.map(params, 'input'));

匿名函数显示hackiness - 我不相信JS保证对象迭代中元素的顺序,因此调用_.fromPairs(_.map(params, function(val) { return [val['name'], val['input'])); 不会。

答案 7 :(得分:1)

使用lodash的另一种方法

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

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

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

这是一个工作示例

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

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

console.log(obj);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
&#13;
&#13;
&#13;