繁体   English   中英

通过将具有相同属性的对象分组来将数组简化为a

[英]reduce array to a by grouping objects with same property

我有一个对象数组,并且尝试按相似的属性值将它们分组。 所以可以说这里是数组

[  
  {  
    "size":"6.5",
    "width":"W"
  },
  {  
    "size":"6.5",
    "width":"M"
  },
  {  
    "size":"7.5",
    "width":"w"
  },
  {  
    "size":"8",
    "width":"M"
  },
  {  
    "size":"8",
    "width":"w"
  }
]

我试图得到这样的东西

[  
  {  
    "size_new":"6.5",
    "width_group":[  
      "W",
      "M"
    ]
  },
  {  
    "size_new":"7.5",
    "width_group":[  
      "M"
    ]
  },
  {  
    "size_new":"8",
    "width_group":[  
      "w",
      "M"
    ]
  }
]

我的js看起来像这样

var _x = [];

for(var i = 0; i < x.length; i++){
    if(x[i].size == x[i+1].size){
        _x[i] = {
            new_size: x[i].size,
            width_group: [x[i].width,x[i+1].width]
        }
    }
}

这是我的小提琴http://jsfiddle.net/sghoush1/ogrqg412/1/

我很确定我的逻辑中可能存在巨大的漏洞

一种简单的方法是将其分为几个步骤:

var sizeSorter = function(a, b) {return a - b};
var sizes = data.reduce(function(acc, item) {
    (acc[item.size] || (acc[item.size] = [])).push(item.width);
    return acc;
}, {}); //=> {8: ['M', 'W'], '6.5': ['W', 'M'], '7.5': ['W']}
Object.keys(sizes).sort(sizeSorter).map(function(size) {
    return {size_new: size, width_group: sizes[size]};
});

之所以必须进行排序,是因为键将按Array顺序排序,在字符串如“ 6.5”之前应带有小数,如“ 8”。

您需要搜索是否已经添加了特定大小,然后仅更新其width 否则插入一个新对象

var _x = x.reduce(function(p,v){
    var existing = p.filter(function(item){return item.new_size === v.size})[0];
    if (existing){
        existing.width_group.push( v.width );
    } else {
        p.push( {
            new_size: v.size,
            width_group:[v.width]
        } );
    }
    return p;
},[]);

演示在http://jsfiddle.net/ogrqg412/3/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM