基于相同属性,在对象列表中合并数值

3

一些背景,这是来自我使用serializeArray()提交表单的结果。我有一个对象列表,格式如下。

[
  {name: 0, value: 'waffles'},
  {name: 0, value: 'pancakes'},
  {name: 0, value: 'french toast'},
  {name: 1, value: 'pancakes'}
]

我希望将所有具有相同name属性的事物放在一起。例如,
[
  {name: 0, value: ['waffles', 'pancakes', 'french toast']},
  {name: 1, value: ['pancakes']}
]

如何处理这个问题?我尝试过的所有方法都只会显示每个名称键的一个答案。


展示给我们你尝试过什么,我们就能够告诉你错误所在。 - Bergi
5个回答

3
这应该可以解决问题:
var newlist = _.map(_.groupBy(oldlist, "name"), function(v, n) {
    return {name: n, values: _.pluck(v, "value")};
});

2

这是我能想到的最好的翻译:

http://jsfiddle.net/Z6bdB/


(注:该段内容为原文内容,无需翻译)
var arr = [
  {name: 0, value: 'waffles'},
  {name: 0, value: 'pancakes'},
  {name: 0, value: 'french toast'},
  {name: 1, value: 'pancakes'}
]

var obj1 = {};

$.each(arr, function(idx, item) { 
    if (obj1[item.name]) {
        obj1[item.name].push(item.value);  
    } else {
        obj1[item.name] = [item.value];
    }
});

var result = [];

for(var prop in obj1) {
    result.push({
        name: prop,
        value: obj1[prop]
    });
}

console.log(result);

1
这似乎有效:

var output = _.chain(input)
    .groupBy(function(x){ return x.name; })
    .map(function(g, k) { return { name: k, value: _.pluck(g, 'value') }; })
    .value();

演示


耶,用完全相同的解决方案快了6秒钟 :-) - Bergi
@Bergi 哈。是的,看起来我们都得出了几乎相同的解决方案。+1 - p.s.w.g
1
我们甚至都错误地将value数组命名为"values" ;-) - Bergi
1
@Bergi 哎呀,好发现。values因为它是一个数组,所以看起来很自然。 - p.s.w.g

1

我是那些使用原生函数的人之一:

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);

0

我可能会这样做:

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可以使事情顺畅进行,使用命名函数可以使事情不那么混乱,并澄清逻辑。

演示:http://jsfiddle.net/ambiguous/G7qwM/2/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接