2010-05-08 44 views
7

Tôi có một mảng có mảng trong đó, nơi tôi muốn sắp xếp các mảng bên ngoài dựa trên các giá trị trong một cột cụ thể ở bên trong.sắp xếp mảng bên ngoài dựa trên giá trị trong mảng bên trong, javascript

Tôi đặt cược có vẻ hơi khó hiểu một chút, vì vậy tôi sẽ chuyển thẳng đến một ví dụ.

dữ liệu ban đầu:

var data = [ 
    [ 
    "row_1-col1", 
    "2-row_1-col2", 
    "c-row_1-coln" 
    ], 
    [ 
    "row_2-col1", 
    "1-row_2-col2", 
    "b-row_2-coln" 
    ], 
    [ 
    "row_m-col1", 
    "3-row_m-col2", 
    "a-row_m-coln" 
    ] 
]; 

Sắp xếp dữ liệu, dựa trên cột với chỉ số 1

data.sortFuncOfSomeKind(1); 

nơi các đối tượng sau đó sẽ trông như thế này;

var data = [ 
    [ 
    "row_2-col1", 
    "1-row_2-col2", 
    "b-row_2-coln" 
    ], 
    [ 
    "row_1-col1", 
    "2-row_1-col2", 
    "c-row_1-coln" 
    ], 
    [ 
    "row_m-col1", 
    "3-row_m-col2", 
    "a-row_m-coln" 
    ] 
]; 

Sắp xếp dữ liệu, dựa trên cột với chỉ số 2

data.sortFuncOfSomeKind(2); 

nơi các đối tượng sau đó sẽ trông như thế này;

var data = [ 
    [ 
    "row_m-col1", 
    "3-row_m-col2", 
    "a-row_m-coln" 
    ], 
    [ 
    "row_2-col1", 
    "1-row_2-col2", 
    "b-row_2-coln" 
    ], 
    [ 
    "row_1-col1", 
    "2-row_1-col2", 
    "c-row_1-coln" 
    ] 
]; 

Các lớn Q

Có một giải pháp hiện có để này mà bạn biết, hoặc tôi sẽ phải viết một bản thân mình? Nếu vậy, đó sẽ là thuật toán sắp xếp dễ nhất để sử dụng? Sắp xếp nhanh chóng?

_L

+2

có thể trùng lặp của [Sắp xếp các đối tượng trong một mảng theo giá trị trường trong JavaScript] (http://stackoverflow.com/questions/1129216/sorting-objects-in-an-array- by-a-field-value- trong javascript), [Javascript: Làm thế nào để sắp xếp một mảng bản ghi theo giá trị trong một trong các trường?] (http://stackoverflow.com/questions/1689679/javascript-how-to-sort-an-array-of -records-by-values-in-one-of-the-fields) – outis

Trả lời

8

Array#sort (xem phần 15.4.4.11 của the spec hoặc MDC) chấp nhận tham số chức năng tùy chọn sẽ được sử dụng để so sánh hai mục nhập cho mục đích sắp xếp. Hàm sẽ trả về -1 nếu đối số đầu tiên là "nhỏ hơn" đối số thứ hai, 0 nếu chúng bằng nhau hoặc 1 nếu đối số đầu tiên là "lớn hơn" đối số thứ hai. Vì vậy:

outerArray.sort(function(a, b) { 
    var valueA, valueB; 

    valueA = a[1]; // Where 1 is your index, from your example 
    valueB = b[1]; 
    if (valueA < valueB) { 
     return -1; 
    } 
    else if (valueA > valueB) { 
     return 1; 
    } 
    return 0; 
}); 

(Bạn có thể rõ ràng nén mã mà một chút, tôi đã giữ nó verbose cho rõ ràng.)

1

Đây từng là một thực hiện loại đó quay trở lại kết quả của một x<y so sánh đơn giản. Giải pháp này không được khuyến khích và bài viết này chỉ còn lại để duy trì cuộc thảo luận tiếp theo.

+0

D'oh. Tôi không biết bạn có thể trả lại x [a]> y [a] cho một giá trị so sánh như thế. Điều đó sẽ giúp tôi tiết kiệm một vài dòng mã. – awgy

+0

@David: Bạn đang trả về 'true' hoặc' false'. Bạn cần phải trả lại -1, 0 hoặc 1. (Tôi đã kiểm tra, trong trường hợp có một số điều thực sự thú vị tôi đã mất tích, nhưng ở trên không sắp xếp chính xác trong mọi trường hợp.) –

+0

@awgy: Bạn không thể: http: // pastie.org/951302 –

4

Dưới đây là một giải pháp không cần một biến riêng để chứa các chỉ số

var arr = [.....] 
arr.sort((function(index){ 
    return function(a, b){ 
     return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 : 1)); 
    }; 
})(2)); // 2 is the index 

Loại này trên chỉ số 2

+1

Bạn nên thay đổi '=' thành '==='. So sánh không thích bị nhầm lẫn với các bài tập. – awgy

+0

Vâng, thay đổi nó thành '==' hoặc '===' tùy thuộc vào nhu cầu của bạn. –

+0

yep, một lỗi nhỏ ở đó - cố định tại –

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