Javascript 基于相同的属性合并对象列表中的值
有点背景,这来自我在上面使用serializeArray()的提交表单 我有一个这样的对象列表Javascript 基于相同的属性合并对象列表中的值,javascript,underscore.js,Javascript,Underscore.js,有点背景,这来自我在上面使用serializeArray()的提交表单 我有一个这样的对象列表 [ {name: 0, value: 'waffles'}, {name: 0, value: 'pancakes'}, {name: 0, value: 'french toast'}, {name: 1, value: 'pancakes'} ] 我想把所有具有相同名称属性的东西放在一起。例如 [ {name: 0, value: ['waffles', 'pancakes'
[
{name: 0, value: 'waffles'},
{name: 0, value: 'pancakes'},
{name: 0, value: 'french toast'},
{name: 1, value: 'pancakes'}
]
我想把所有具有相同名称属性的东西放在一起。例如
[
{name: 0, value: ['waffles', 'pancakes', 'french toast']},
{name: 1, value: ['pancakes']}
]
这件事怎么办?我尝试过的所有方法都只能为每个名称键显示一个答案。以下是我能想到的最好答案: 这应该做到:
var newlist = _.map(_.groupBy(oldlist, "name"), function(v, n) {
return {name: n, values: _.pluck(v, "value")};
});
这似乎有效:
var output = _.chain(input)
.groupBy(function(x){ return x.name; })
.map(function(g, k) { return { name: k, value: _.pluck(g, 'value') }; })
.value();
我是使用本机函数的人之一:
var food = [
{name: 0, value: 'waffles'},
{name: 0, value: 'pancakes'},
{name: 0, value: 'french toast'},
{name: 1, value: 'pancakes'}
];
var result = food.reduce(function(res,dish){
if (!res.some(function(d){return d.name === dish.name })){
var values = food.filter(function(d){ return d.name === dish.name }).map(function(d){ return d.value; });
res.push({name: dish.name, value : values});
}
return res;
}, []);
console.log(result);
我可能会这样做:
function them_into_groups(m, h) {
m[h.name] || (m[h.name] = [ ]);
m[h.name].push(h.value);
return m;
}
function them_back_to_objects(v, k) {
return {
name: +k,
value: v
};
}
var output = _(input).chain()
.reduce(them_into_groups, { })
.map(them_back_to_objects)
.value();
使用.chain
和.value
可以使事情顺利进行,使用命名函数可以减少混乱并澄清逻辑
演示:Yay,使用完全相同的解决方案快6秒:-)@Bergi Ha。是的,看起来我们都找到了几乎相同的解决方案+1我们甚至都错误地将
值
数组命名为“值
”;-)@伯吉:哎呀,接得好<代码>值看起来很自然,因为它是一个数组。向我们展示您的尝试,我们将能够向您展示错误。
function them_into_groups(m, h) {
m[h.name] || (m[h.name] = [ ]);
m[h.name].push(h.value);
return m;
}
function them_back_to_objects(v, k) {
return {
name: +k,
value: v
};
}
var output = _(input).chain()
.reduce(them_into_groups, { })
.map(them_back_to_objects)
.value();