使用像Underscore,Lodhash,Ramda,Immutable JS这样的函数式Javascript,如果我有一些(半准确的)数据如下:
var data = {
people: [
{name: 'Vishwanathan Anand', age: 46},
{name: 'Garry Kasparov', age: 52},
{name: 'Magnus Carlsen', age: 25},
],
computers: [
{name: 'Deep Blue', age: 26},
{name: 'Deep Fritz', age: 21},
{name: 'Deep Thought', age: 28},
]
}
我希望将它转换为
var data = {
people: [
{name: 'Vishwanathan Anand', age: 46, rank: 0},
{name: 'Garry Kasparov', age: 52, rank: 1},
{name: 'Magnus Carlsen', age: 25, rank 2},
],
computers: [
{name: 'Deep Blue', age: 26},
{name: 'Deep Fritz', age: 21},
{name: 'Deep Thought', age: 28},
]
}
请注意,只有people
子结构获得了rank
。
我知道我可以
_.extend({
computers: _.map(data.people, (p, i) => {
p.rank = i;
return p;
})}, {
computers: data.computers
})
但是,如果我不需要使用任何变量(不再访问data
!)使用下划线的chain
就像这样
_.chain(data).subset('people').map((p, i) => {
p.rank = i;
return p;
})
注意到,这是一个真正的问题,而不是方便的问题。我正在做一个项目,它涉及到为函数运算符和变量创建一种环境,是不允许的。
它似乎下划线之类的操作在整个列表结构(数组/列表)上进行。有没有什么方法可以让它在操作一个子结构的同时保留其余的部分?
发布于 2016-05-20 22:25:22
这个解决方案有点令人不快,但它在这种情况下是有效的。
_.chain(data)
.mapObject((value, key) => {
if (key==='people') {
return value.map((p,i) => _.extend(p, {rank: i}));
} else {
return value;
}
})
.value();
发布于 2019-05-31 03:20:06
使用Ramda,您可以使用R.evolve创建一个函数,该函数接受一个键和一个回调(cb
),并将键的项映射到所需的形式:
const { evolve, addIndex, map } = R
const mapPart = (cb, key) => evolve({
[key]: addIndex(map)(cb)
})
const data = {"people":[{"name":"Vishwanathan Anand","age":46},{"name":"Garry Kasparov","age":52},{"name":"Magnus Carlsen","age":25}],"computers":[{"name":"Deep Blue","age":26},{"name":"Deep Fritz","age":21},{"name":"Deep Thought","age":28}]}
const result = mapPart((o, rank) => ({ ...o, rank }), 'people')(data)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
https://stackoverflow.com/questions/37345226
复制相似问题