n06*_*rin 5 javascript functional-programming ramda.js
我有一个数组:
var a = [
{id: 1, val: 'a'},
{id: 2, val: 'b'},
{id: 3, val: 'c'},
{id: 4, val: 'd'},
]
Run Code Online (Sandbox Code Playgroud)
我想将其转换为:
var b = {
1: 'a',
2: 'b',
3: 'c',
4: 'd',
}
Run Code Online (Sandbox Code Playgroud)
实际上我使用的是纯js:
var b = a.reduce(
(ac, pr) => ({
...ac,
[pr.id]: pr.val,
}),
{}
);
Run Code Online (Sandbox Code Playgroud)
但也许 Ramda.js 有一些特别的东西?
您正在寻找 Ramda 的.mergeAll()
方法:
var b = R.mergeAll(a.map(function(o) {
return {
[o.id]: o.val
}
}));
Run Code Online (Sandbox Code Playgroud)
该.map()
调用将从每个项目返回自定义对象,仅取值,然后.mergeAll()
将它们合并array
为一个object
。
mergeAll
文件:
将一组对象合并为一个对象。
演示:
var b = R.mergeAll(a.map(function(o) {
return {
[o.id]: o.val
}
}));
Run Code Online (Sandbox Code Playgroud)
var a = [{
id: 1,
val: 'a'
},
{
id: 2,
val: 'b'
},
{
id: 3,
val: 'c'
},
{
id: 4,
val: 'd'
},
];
var b = R.mergeAll(a.map(function(o) {
return {
[o.id]: o.val
}
}));
console.log(b);
Run Code Online (Sandbox Code Playgroud)
如果还有人路过这里,确实是:
R.indexBy(R.prop('id'), someArray);
Run Code Online (Sandbox Code Playgroud)
编辑:班纳特是正确的。如果我们想要val
作为每个键的唯一值,我们可以在之后“拔出”它:
const createValDict = R.pipe(
R.indexBy(R.prop('id')),
R.pluck('val')
)
const valDict = createValDict(myArr)
Run Code Online (Sandbox Code Playgroud)
Object.assign
对于普通的 Javascript,您可以使用、扩展语法...
、解构赋值Array#map
和简写属性的组合。
var a = [{ id: 1, val: 'a' }, { id: 2, val: 'b' }, { id: 3, val: 'c' }, { id: 4, val: 'd' }],
result = Object.assign(...a.map(({ id, val }) => ({ [id]: val })));
console.log(result);
Run Code Online (Sandbox Code Playgroud)