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)
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后的对象之前操作数组,以获得准确的所需结果.
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)
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)
这似乎是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,好主意...)
它也可以在不使用任何 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)
| 归档时间: |
|
| 查看次数: |
73562 次 |
| 最近记录: |