2011-06-25 41 views
6
real_order = [ '1', '2', '3', '4']; 

friends = [ { name: 'jess', id: '4'}, 
      { name: 'alex', id: '1'}, 
      { name: 'kat', id: '3' }, 
      { name: 'bob', id: '2' } 
      ] 

Làm cách nào để làm cho mảng "bạn bè" "khớp" với các phần tử trong real_order? Kết quả phải là:Làm cách nào để sắp xếp lại mảng này trong Javascript dựa trên một mảng khác?

[ 
      { name: 'alex', id: '1'}, 
      { name: 'bob', id: '2' }, 
      { name: 'kat', id: '3' }, 
      { name: 'jess', id: '4'}, 
      ] 

Giải pháp hiệu quả nhất là gì?

Trả lời

5

Dưới đây là một số mã mà sẽ làm điều đó:

var i, d = {}, result = []; 
for(i=0; i<friends.length; ++i) 
{ 
    d[friends[i].id] = friends[i]; 
} 

for(i=0; i<real_order.length; ++i) 
{ 
    result.push(d[real_order[i]]); 
} 

Điều này không là nó tạo ra một từ điển keyed trên mỗi id bạn bè, sau đó sử dụng các mảng thứ hai để làm một cái nhìn lên và xây dựng mảng mới. Mảng sắp xếp lại kết quả được lưu trữ trong kết quả.

+0

quá nhanh chóng, giải pháp rất giống tôi sẽ có kiến ​​nghị – Eineki

0

chắc chắn rằng real_order là trong phạm vi toàn cầu và điều này nên làm điều đó:

friends.sort(function(a, b) { 
    if (real_order.indexOf(a.id) > real_order.indexOf(b.id)) { 
     return 1; 
    }else{ 
     return -1; 
    } 
}); 
+0

hãy nhớ để lại comment khi bạn downvote –

0

Một giải pháp lệnh. Xấu xí như jQuery, nhưng những người như John Resig yêu phong cách này vì một lý do :)

friends.sort(
    (function(order){ 
    return function(a, b) { 
     return order.indexOf(a.id)-order.indexOf(b.id); 
    } 
    })(real_order) 
); 
+0

Tôi khá chắc chắn điều này là hiệu quả nhất trong Javascript –

4

Mảng có thể được sắp xếp sử dụng thuật toán tùy chỉnh loại riêng của bạn, do đó bạn không thực sự cần real_order. Đây là cách tôi muốn làm điều đó (chỉnh sửa: thêm vào loại ủy để phân loại giảm dần):

var friends = [ 
      { id:4, name: 'jess'}, 
      { id:1, name: 'alex'}, 
      { id:3, name: 'kat' }, 
      { id:2, name: 'bob' } 
]; 

var order = function(a,b,desc){ 
    return desc ? b.id - a.id : a.id - b.id; 

}, 
orderDesc: function(a,b){return order(a,b,true);}; 

var friendsOrdered = friends.sort(order); 
alert(friendsOrdered[0].name); //=> alex 
alert(friendsOrdered[3].name); //=> jess 

//or sort descending 
var friendsOrdered = friends.sort(orderDesc); 
alert(friendsOrdered[0].name); //=> jess 
alert(friendsOrdered[3].name); //=> alex 
Các vấn đề liên quan