2015-01-28 1 views
0

У меня есть массив объектов, и я пытаюсь сгруппировать их по аналогичному значению свойства. Так что давайте говорить здесь массивуменьшить массив до a, сгруппировав объекты с тем же свойством

[ 
    { 
    "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" 
    ] 
    } 
] 

My 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

Возможный дубликат: [Remap array to object] (http://stackoverflow.com/questions/28182367/remap-array-to-object) – Xotic750

+1

var o = {}; x.forEach (function (a) {o [a.size] = o [a.size] || {size: a.size, widths: []}; o [a.size] .widths.push (a.width);}); o; – dandavis

+0

@ dandavis - works – soum

ответ

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; 
},[]); 

Демонстрация на http://jsfiddle.net/ogrqg412/3/

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

, что сортировка необходимо потому, что ключи будут отсортированный в порядке массива, с небольшими номерами, например «8», перед строками типа «6.5».

+0

@ Scott-- согласился – soum

Смежные вопросы