Javascript 基于相同的属性合并对象列表中的值

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'

有点背景,这来自我在上面使用serializeArray()的提交表单 我有一个这样的对象列表

[
  {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();