2016-08-24 21 views
8

Potrzebuję znaleźć najprostszy sposób ustawiania porządku na tablicę obiektów. Na przykład, nie jest macierz:Ustaw porządek na tablicę obiektów w javascript

var array = [ 
    {id: 1, name: "Matt"}, 
    {id: 2, name: "Jack"}, 
    {id: 3, name: "Morgan"}, 
    {id: 4, name: "Bruce"} 
]; 

i dostarczyły

var order = [1,4,2,3]; 

który odnosi się do obiektu id właściwości array elementów.

Teraz muszę uporządkować tablicę więc powinno być tak:

var array = [ 
    {id: 1, name: "Matt"}, 
    {id: 4, name: "Bruce"}, 
    {id: 2, name: "Jack"}, 
    {id: 3, name: "Morgan"} 
] 
+0

Więc masz porządek, który powinien zostać osiągnięty, a zatem chcesz uporządkować swoją tablicę? –

+0

Nie rozumiem, co musisz zrobić, chcesz zamówić arrayobject dla Id? – LorenzoBerti

+0

@Pranav C Balan rozwiązał ten problem i zrozumiał, proszę sprawdzić. Również @Nenad Vracar ma dobry sposób na rozwiązanie tego problemu. Moja 'kolejność' ma kolejność identyfikatorów z obiektów 'tablica'. –

Odpowiedz

11

Zastosowanie Array#sort metoda sortowania i wewnątrz sortowania niestandardowego wykorzystania funkcji Array#indexOf metoda, aby uzyskać indeks.

var array = [{ 
 
    id: 1, 
 
    name: "Matt" 
 
}, { 
 
    id: 2, 
 
    name: "Jack" 
 
}, { 
 
    id: 3, 
 
    name: "Morgan" 
 
}, { 
 
    id: 4, 
 
    name: "Bruce" 
 
}]; 
 

 
var order = [1, 4, 2, 3]; 
 

 

 
array.sort(function(a, b) { 
 
    // sort based on the index in order array 
 
    return order.indexOf(a.id) - order.indexOf(b.id); 
 
}) 
 

 
console.log(array);

+0

Co powinna funkcja zwróciła? Wartość liczbowa? Wartość boolowska? – user6245072

+0

@ user6245072: liczba, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Description –

1

Można również użyć reduce() na [1,4,2,3] tablicy powrót obiektu, gdzie klucze będą elementy i wartości będą Indeks każdego elementu, a następnie sortować według tego obiektu.

var array = [ 
 
    {id: 1, name: "Matt"}, 
 
    {id: 2, name: "Jack"}, 
 
    {id: 3, name: "Morgan"}, 
 
    {id: 4, name: "Bruce"} 
 
]; 
 

 
var s = [1,4,2,3].reduce((r, e, i) => {return r[e] = i, r}, {}); 
 
var result = array.sort(function(a, b) { 
 
    return s[a.id] - s[b.id]; 
 
}); 
 
console.log(result)

0

Chyba wszystko, co wiąże porządek nie może być bardziej skuteczne niż rozwiązania O (2n). Więc chciałbym wykonać tę pracę z dwoma zmniejszeniami w następujący sposób;

var arr = [{id: 1, name: "Matt"}, {id: 2, name: "Jack"}, {id: 3, name: "Morgan"}, {id: 4, name: "Bruce"}], 
 
    order = [1,4,2,3], 
 
    lut = order.reduce((t,e,i) => (t[e] = i,t),{}), 
 
result = arr.reduce((res,obj) => (res[lut[obj.id]] = obj, res) ,[]); 
 
console.log(result);