2016-05-06 4 views
-4

Ich habe ein Array von Objekten wie.Sortierung Array von Objekt für einige Schlüssel in Javascript

[{ 
    id: 1, 
    age: 23 
}, { 
    id: 1, 
    age: 25 
}, { 
    id: 2, 
    age: 230 
}, { 
    id: 2, 
    age: 255 
}, { 
    id: 3, 
    age: 232 
}, { 
    id: 1, 
    age: 215 
}] 

Ich muss das letzte Array durch Sortieren mit dem höchsten Alter für jede ID erhalten. so wird das letzte Array sein.

[{ 
    id: 1, 
    age: 215 
    }, { 
    id: 2, 
    age: 255 
    }, { 
    id: 3, 
    age: 232 
    }] 
+3

Was haben Sie unternommen, um dieses Problem selbst zu lösen? –

+0

Dies scheint nicht zu sortieren. – Oriol

+1

Wie wird das gewünschte Ausgabebeispiel sortiert? Und warum haben Sie doppelte IDs? – jamiestraw

Antwort

1

Sie können einen Hash erstellen, in dem Sie das Objekt mit dem maximalen Alter für jede ID speichern. Dann sortiere seine Schlüssel numerisch und erhalte die Werte in dieser Reihenfolge.

var hash = array.reduce(function(hash, obj) { 
    if(!hash[obj.id]) hash[obj.id] = obj; 
    else if(hash[obj.id].age < obj.age) hash[obj.id] = obj; 
    return hash; 
}, Object.create(null)); 
Object.keys(hash).sort(function(a,b) { 
    return a - b; 
}).map(function(id) { 
    return hash[id]; 
}); 
0

ein einzelner Liner hier

var arr = [{ 
 
    id: 1, 
 
    age: 23, 
 
}, { 
 
    id: 1, 
 
    age: 25, 
 
}, { 
 
    id: 2, 
 
    age: 230, 
 
}, { 
 
    id: 2, 
 
    age: 255, 
 
}, { 
 
    id: 3, 
 
    age: 232, 
 
}, { 
 
    id: 1, 
 
    age: 215, 
 
}], 
 
lut = {}, 
 
res = arr.sort((a,b) => b.age - a.age).filter(o => lut[o.id] ? false : lut[o.id] = true).sort((a,b) => a.id - b.id); 
 

 
document.write("<pre>" + JSON.stringify(res,null,2) + "</pre>");

0

Sie normalerweise filter mit indexOf-remove duplicate elements from an array verwenden würde. Wenn Array-Elemente Objekte sind, können Sie findIndex verwenden, um anhand bestimmter Eigenschaftswerte nach dem Index eines Elements zu suchen.

let result = [{ 
 
    id: 1, 
 
    age: 23, 
 
}, { 
 
    id: 1, 
 
    age: 25, 
 
}, { 
 
    id: 2, 
 
    age: 230, 
 
}, { 
 
    id: 2, 
 
    age: 255, 
 
}, { 
 
    id: 3, 
 
    age: 232, 
 
}, { 
 
    id: 1, 
 
    age: 215, 
 
}].sort((a,b) => b.age - a.age) 
 
.filter((row,pos,self) => self.findIndex(item => item.id === row.id) === pos) 
 
.sort((a,b) => a.id - b.id); 
 

 
document.body.textContent = JSON.stringify(result);

Außerdem müssen Sie die Aufmerksamkeit auf seinen Browser-Unterstützung zu zahlen.

0

oder auf diese Weise mit lodash des Uniq() -Methode zu vermeiden:

arr.sort(function(a,b){ 
    return b.id > a.id; 
}).reverse(); 
var max = arr.length; 
var i = 0; 
while(i < max - 1){ 
    if (arr[i].id === arr[i+1].id) arr.splice(i+1,1); 
    else i++ 
    max = arr.length; 
} 
0

Sie tun können, auf diese Weise Sortierung vanillaJS Verwendung.

function sortByAgeDesc(a,b) {return a.age > b.age ? -1 : a.age === b.age ? 0 : 1;} 


output = input.sort(sortByAgeDesc); 

Jetzt ist die Frage, Sie wollen nur unterschiedliche IDs.

Verwandte Themen