Po pierwsze, w języku JavaScript generalnie nie jest dobrym pomysłem powtarzanie nad tablicami przy użyciu for ... in
. Szczegółowe informacje można znaleźć na stronie Why is using "for...in" with array iteration a bad idea?.
Więc możesz spróbować coś takiego:
var groups = {};
for (var i = 0; i < myArray.length; i++) {
var groupName = myArray[i].group;
if (!groups[groupName]) {
groups[groupName] = [];
}
groups[groupName].push(myArray[i].color);
}
myArray = [];
for (var groupName in groups) {
myArray.push({group: groupName, color: groups[groupName]});
}
Korzystanie z pośrednictwa groups
obiektu tutaj pomaga przyspieszyć rzeczy, ponieważ pozwala uniknąć zagnieżdżania pętli do przeszukiwania tablic. Ponadto, ponieważ groups
jest obiektem (a nie tablicą), iteracja nad nim za pomocą for ... in
jest właściwa.
Uzupełnienie
FWIW, jeśli chcesz uniknąć zduplikowane wpisy koloru w wyniku macierzy można dodać oświadczenie if
powyżej linii groups[groupName].push(myArray[i].color);
ustrzec się przed duplikatów. Używając jQuery wyglądałoby to tak;
if (!$.inArray(myArray[i].color, groups[groupName])) {
groups[groupName].push(myArray[i].color);
}
Bez jQuery może chcesz dodać funkcję, która robi to samo co jQuery inArray
:
Array.prototype.contains = function(value) {
for (var i = 0; i < this.length; i++) {
if (this[i] === value)
return true;
}
return false;
}
a następnie używać go tak:
if (!groups[groupName].contains(myArray[i].color)) {
groups[groupName].push(myArray[i].color);
}
pamiętać, że zarówno Przypadek, który spowolni trochę z powodu całej iteracji, więc jeśli nie musisz unikać duplikatów kolorów w tablicach wyników, polecam unikanie tej dodatkowej współpracy. de. Nie
Czy próbowali jeszcze coś? Istnieje już wiele ściśle powiązanych pytań dotyczących SO. Zobacz [this] (http://stackoverflow.com/questions/30893667/group-by-json-array-using-jquery), [this] (http://stackoverflow.com/questions/12873228/javascript-group- by-array) i [this] (http://stackoverflow.com/questions/25676026/group-array-with-sub-array). –
Mnóstwo błędów składniowych. Przed wysłaniem sprawdź swój kod. – 1983