2016-08-24 36 views
8

Tôi cần tìm một cách đơn giản nhất để đặt thứ tự cho mảng đối tượng. Ví dụ, có một mảng:Đặt thứ tự cho mảng đối tượng trong javascript

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

và tôi đã cung cấp

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

đó đề cập đến đối tượng id tài sản của array mục.

Bây giờ tôi cần phải sắp xếp lại mảng vì vậy nó nên được như:

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

Vì vậy, bạn có một trật tự, trong đó cần đạt được và do đó bạn muốn sắp xếp lại mảng của bạn? –

+0

Tôi không hiểu những gì bạn cần làm, Bạn muốn đặt hàng arrayobject cho Id? – LorenzoBerti

+0

@Pranav C Balan giải quyết vấn đề này, và anh hiểu, hãy kiểm tra. Ngoài ra @Nenad Vracar có cách tốt để giải quyết vấn đề này. My 'var order' có thứ tự các id từ các đối tượng' mảng'. –

Trả lời

11

Sử dụng Array#sort phương pháp để phân loại và bên trong tùy chỉnh loại chức năng sử dụng Array#indexOf phương pháp để có được chỉ số.

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

Chức năng nào sẽ được trả lại? Giá trị số? Một giá trị boolean? – user6245072

+0

@ user6245072: một số, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Description –

1

Bạn cũng có thể sử dụng reduce() trên [1,4,2,3] mảng trở về đối tượng mà các phím sẽ được các yếu tố và giá trị này sẽ được chỉ số của từng yếu tố và sau đó sắp xếp theo đối tượng đó.

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

Tôi đoán bất cứ điều gì có liên quan đến loại không thể có hiệu quả hơn nhiều so với một O (2n) giải pháp. Vì vậy, tôi muốn làm công việc này với hai làm giảm như sau;

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

Các vấn đề liên quan