我有一个对象数组,我试图通过类似的属性值对它们进行分组。所以我们这里说的是数组
[
{
"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/
我很确定我的逻辑中可能存在巨大的漏洞
答案 0 :(得分:3)
这样做的一个简单方法是将其分为几个步骤:
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]};
});
这种排序是必要的,因为按键将按照数组顺序进行排序,其中包含小数字,例如&#39; 8&#39;在诸如&#39; 6.5&#39;。
之类的字符串之前答案 1 :(得分:1)
您需要搜索是否已添加特定尺寸,然后仅更新其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;
},[]);
演示