2012-10-08 49 views
6

thể trùng lặp:
How to sort an associative array by its values in Javascript?Làm thế nào để sắp xếp một mảng (kết hợp) theo giá trị?

Vì vậy, trước hết tôi biết về mặt kỹ thuật Javascript không có mảng kết hợp, nhưng tôi đã không chắc chắn làm thế nào để tiêu đề nó và nhận được ý tưởng ngay trên .

Vì vậy, đây là mã tôi có,

var status = new Array(); 
status['BOB'] = 10 
status['TOM'] = 3 
status['ROB'] = 22 
status['JON'] = 7 

Và tôi muốn sắp xếp nó bằng giá trị như vậy mà khi tôi vòng qua nó sau này ROB đến trước, sau đó BOB vv

tôi đã cố gắng,

status.sort() 
status.sort(function(a, b){return a[1] - b[1];}); 

Nhưng không ai trong số họ dường như thực sự làm gì cả.

In mảng ra khỏi bảng điều khiển trước và sau khi kết quả được sắp xếp theo cùng thứ tự.

+4

Đó là việc sử dụng sai của mảng JS. Chỉ sử dụng các phím số với mảng. '.sort' không làm bất cứ điều gì vì nói đúng mảng của bạn không có bất kỳ phần tử nào. Bạn phải sử dụng các đối tượng trong trường hợp này. Tôi khuyên bạn nên đọc [MDN - Làm việc với các đối tượng] (https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects). –

+2

Ngoài ra: [Sắp xếp đối tượng JavaScript theo giá trị thuộc tính] (http://stackoverflow.com/questions/1069666/sorting-javascript-object-by-property-value). –

+0

Mặc dù được đánh dấu là bản sao (các) giải pháp được trình bày bên dưới không được đề cập trong bản sao. – PopeJohnPaulII

Trả lời

21

Mảng chỉ có thể có chỉ mục bằng số. Bạn sẽ cần phải viết lại nó như là một đối tượng, hoặc một mảng đối tượng.

var status = new Object(); 
status['BOB'] = 10 
status['TOM'] = 3 
status['ROB'] = 22 
status['JON'] = 7 

hoặc

var status = new Array(); 
status.push({name: 'BOB', val: 10}); 
status.push({name: 'TOM', val: 3}); 
status.push({name: 'ROB', val: 22}); 
status.push({name: 'JON', val: 7}); 

Nếu bạn thích những phương pháp status.push, bạn có thể sắp xếp nó với:

status.sort(function(a,b) { 
    return a.val - b.val; 
}); 
+0

Tôi thích cách tiếp cận này (Array), điều gì sẽ là cách thích hợp để gọi và sắp xếp theo 'val'? – PopeJohnPaulII

+0

Tôi đã cập nhật câu trả lời của mình để bao gồm sắp xếp theo 'val' với một mảng đối tượng. – saml

+0

Giải pháp tuyệt vời và đơn giản. – Ahsan

2

Đệ Nhất - Đó là không chính xác để tạo ra một mảng để sử dụng nó như một bản đồ. Thay vào đó, hãy sử dụng Đối tượng:

var status = {}; 
status['BOB'] = 10; 

Mảng là một lớp có logic để xử lý chỉ mục tuần tự số.

Bây giờ trả lời các câu trả lời của bạn, Mappings không có trật tự, không có đảm bảo về trật tự nó sẽ lặp như vậy không có những điều như "sắp xếp một ánh xạ"

Tôi sugest bạn sử dụng một mảng với các đối tượng với trọng điểm, giá trị:

var status = []; 
status.push({ key: 'BOB', value: 10 }); 

Hoặc hai mảng:

var status = { 
    keys: [], 
    values: [] 
}; 
status.keys.push('BOB'); 
status.value.push(10); 

Nó tùy thuộc vào nhu cầu của bạn.

1

Bạn nên sử dụng Object JavaScript bên mảng: jsfidle

 var status = new Array(); 
    status.push({key: 'BOB', value: 10}); 
    status.push({key: 'TOM', value: 3}); 
    status.push({key: 'ROB', value: 22}); 
    status.push({key: 'JON', value: 7}); 
    status.sort(function(a, b){ 

     if(a.value > b.value){ 
     return -1; 
     } 
     else if(a.value < b.value){ 
     return 1; 
     } 
     return 0; 
    }); 
+0

Điều này có lợi cho việc so sánh Chuỗi – cw24

2

"Mảng" trong javascript là số lượng được lập chỉ mục. "Đối tượng" là những gì bạn sẽ gọi là mảng kết hợp. "Đối tượng" vốn không có thứ tự.

Vì vậy, để thực hiện việc này, bạn sẽ cần phải thay đổi cấu trúc dữ liệu của mình một chút.

var arr = []; // Array 

// push a few objects to the array. 
arr.push({name: 'BOB', age: 10}); 
arr.push({name: 'TOM', age: 3}); 
arr.push({name: 'ROB', age: 22}); 
arr.push({name: 'JON', age: 7}); 

var sorted = arr.sort(function(a, b) { 
    return a.age - b.age; 
}); 

console.log(sorted); 

enter image description here

+0

Cách sắp xếp theo tên? –

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