2013-03-28 30 views
5

Trong javascript, nếu tôi có một mảng của mảng, giống như sau:Sử dụng Javascript để sắp xếp một mảng của mảng số

X = [ [1,2,3,4], 
     [1,1,2,3], 
     [1,1,3], 
     [1,4], 
     [2,1,2], 
     [2,2] 
    ] 

Javascript sắp xếp mảng của tôi, so sánh mục đầu tiên đầu tiên, sau đó thứ hai, và vân vân , để X.sort() trả về các mục sau:

[ [1,1,2,3], 
    [1,1,3], 
    [1,2,3,4], 
    [1,4], 
    [2,1,2], 
    [2,2] 
] 

Tôi muốn gì. Vấn đề là các toán tử so sánh để so sánh các yếu tố trong mảng là hoặc null, vì vậy [10,2] < [2,2], và, ví dụ,

[[10,2],[1,1,3],[2,2]].sort() -> [[1,1,3],[10,2],[2,2]] 

tôi cần nó để sắp xếp số lượng, vì vậy mà tôi có được một mảng được sắp xếp của [[1,1,3],[2,2],[10,2]].

tôi đã cố gắng sử dụng một hàm so sánh function(a,b){return (a-b) }, mà sẽ làm việc để phân loại một loạt các con số, nhưng điều này không đúng loại mảng của tôi, có ý nghĩa (tôi nghĩ) vì [10,2] - [1,1,3] sản lượng NaN

Làm thế nào để đi về sắp xếp một mảng của mảng số?

+5

Nếu bạn thay đổi hàm so sánh để tính toán thực tế là các đối số được truyền là các mảng, nó sẽ hoạt động. http://jsfiddle.net/SYHr2/ – Rikonator

+0

@Rikonator Giải pháp tuyệt vời, bạn có thể muốn đăng câu trả lời đó, có vẻ như hoạt động – Ian

+0

@Rikonator Fantastic! Cung cấp cho tôi khả năng phân loại tôi cần với một chức năng mỏng không ghi đè lên phương pháp .sort tự nhiên. Nếu bạn viết nó như là một câu trả lời tôi sẽ chấp nhận nó. – ckersch

Trả lời

6

Như tôi đã nói trong lời nhận xét của tôi, sort chức năng cần vào tài khoản cho thực tế là nó nhận mảng như đối số và không phải là giá trị đơn giản. Vì vậy, bạn cần phải xử lý chúng cho phù hợp.

Tôi đề xuất điều này;

var compFunc = function (a, b) { 
    var len = a.length > b.length ? b.length : a.length; 

    for(var i=0; i<len; ++i) { 
     if(a[i] - b[i] !== 0) 
      return a[i] - b[i]; 
    } 

    return (a.length - b.length); 
}; 

Đầu tiên, tìm kiếm sự khác biệt về độ dài chung của hai mảng. Nếu độ dài chung là chính xác, thì nó sẽ sắp xếp theo chiều dài mảng. Here's a working fiddle.

+1

'var len = Math.min (a.length, b.length);' Ngoài ra, kiểu chặn, hàm của bạn chính là cách tôi đã mã hóa nó. Cảm ơn bạn đã không đi với "chỉ có một điểm xuất cảnh từ một chức năng" điên rồ! – ErikE

1

Khi bạn làm X.sort(), Javascript là so sánh mảng cá nhân của bạn như dây đàn. Về cơ bản nó thực hiện a.toString().localeCompare(b.toString()). Đây không phải điều bạn muốn.

a.toString() thường là giống như a.join(',')

gì tôi sẽ làm là so sánh từng phần tử trong mảng bằng cách sử dụng một vòng lặp for.

Something như thế này:

X.sort(function(a,b){ 
    // Start off assuming values are equal 
    var ret = 0; 

    // Loop through a 
    for(var a_i = 0, a_length = a.length; a_i < a_length; a_i++){ 
     // If b is shorter than a, it comes first 
     if(typeof b[a_i] === 'undefined'){ 
      ret = 1; 
      break; 
     } 
     // if the element in a and b are *not* the same, then we can sort 
     else if(a[a_i] !== b[a_i]){ 
      ret = a[a_i] - b[a_i]; 
      break; 
     } 
    } 

    return ret; 
}); 
0

Bạn cần phải sắp xếp và so sánh giữa 2 mảng: http://jsfiddle.net/pXzB6/

var arr = [[10,2],[1,1,3],[2,2]]; 

arr.sort(function(a,b){ 
    for(var i=0;i<a.length;i++){ 
     var item_a = a[i]; 
     for(var j=0;j<b.length;b++){ 
      var item_b = b[j]; 
      if(item_a == item_b){ 
       continue; 
      } 
      else{ 
       return item_a > item_b; 
      } 
     } 
    } 

    if(a.length == b.length){ 
     return 0; 
    } 
    else{ 
     return a.length > b.length; 
    } 
}); 

console.log(arr); 
0

var points = [40, 100, 1, 5, 25, 10];

điểm.sắp xếp (hàm (a, b) {return a-b});

sau đó kết quả là: 1,5,10,25,40,100

Đây là cách đơn giản nhất tôi nghĩ rằng, nó làm việc.

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