lodash:将数组映射到对象

cor*_*ore 64 javascript lodash

是否有内置的lodash函数来实现:

var params = [
    { name: 'foo', input: 'bar' },
    { name: 'baz', input: 'zle' }
];
Run Code Online (Sandbox Code Playgroud)

输出这个:

var output = {
    foo: 'bar',
    baz: 'zle'
};
Run Code Online (Sandbox Code Playgroud)

现在我只是使用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');
Run Code Online (Sandbox Code Playgroud)

想知道是否有一个lodash捷径.

sta*_*las 95

lodash 4.17.2的另一种方式

_.chain(params)
    .keyBy('name')
    .mapValues('input')
    .value();
Run Code Online (Sandbox Code Playgroud)

要么

_.mapValues(_.keyBy(params, 'name'), 'input')
Run Code Online (Sandbox Code Playgroud)

或者 _.reduce

_.reduce(
    params,
    (acc, { name, input }) => ({ ...acc, [name]: input }),
    {}
)
Run Code Online (Sandbox Code Playgroud)

  • _.keyBy是此答案中指出的最简单的方法/sf/answers/3319202491/ (3认同)

dan*_*y74 34

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

文档在这里

以下示例用法:

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

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

  • 这是一个很酷的答案,但它 ** 不** 回答这个问题。值应该是字符串而不是对象。 (8认同)
  • 首先看看this以了解stasovlas投票最多的答案。 (3认同)

Jag*_*row 29

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

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

_.reduce(params , function(obj,param) {
 obj[param.name] = param.input
 return obj;
}, {});
Run Code Online (Sandbox Code Playgroud)


dje*_*lin 10

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

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

_.zipObject(_.map(params, 'name'), _.map(params, 'input'));
Run Code Online (Sandbox Code Playgroud)

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

_.fromPairs(_.map(params, function(val) { return [val['name'], val['input']));
Run Code Online (Sandbox Code Playgroud)

匿名函数显示了 hackiness - 我不相信 JS 保证对象迭代中元素的顺序,所以调用是.values()行不通的。


Fai*_*ain 10

您可以使用带有数组缩减方法和ES6解构的一个线性javascript 将键值对的数组转换为对象.

arr.reduce((map, { name, input }) => ({ ...map, [name]: input }), {});
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这是O(n ^ 2)。 (2认同)
  • 该版本的复杂度为 O(n),但它会修改其输入,这是您通常不希望看到的。我认为对于这类事情,通常最好编写一个带有 foreach 循环的完整实用函数,将其放在 utils 文件夹中的某处并导入它,而不是试图巧妙地使用单行代码。 (2认同)

Kou*_*jee 7

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);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
Run Code Online (Sandbox Code Playgroud)


Rai*_*ony 7

这似乎是Object.assign的工作:

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

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

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

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


Zee*_*tti 6

它也可以在不使用任何 lodash 函数的情况下求解,如下所示:

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

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


console.log(output);
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明