2011-11-30 39 views
19

Tôi đang cố gắng so sánh hai mảng trong javascript.javascript so sánh mảng đáng ngạc nhiên

Những gì tôi muốn là:

một < b ⇔ ∃ i ≥ 0 s.t. a [i] < b [i] và & forall; 0 ≤ j < i, a [j] = b [j]

Vì vậy, mảng số công việc không âm như mong muốn:

firebug> [0,1,2,3,4] < [1,0,0] 
true 

Và so sánh số âm với zero tác phẩm như mong đợi:

firebug> [-1, 1] < [0, 0] 
true 

Nhưng so sánh số âm với số âm là ... ngạc nhiên khi:

firebug> [-2] < [-1] 
false 
firebug> -2 < -1 
true 

Điều gì đang xảy ra ở đây, vì vậy tôi có thể sửa trực giác của tôi để so sánh mảng có nghĩa là trong javascript?

+0

Xem thêm [như thế nào mảng so sánh trong JavaScript] (http: //stackoverflow.com/q/16566772/1048572) để giải thích về hành vi và [Hàm so sánh ba chiều cho mảng trong Javascript] (http://stackoverflow.com/q/23881838/1048572) cho một giải pháp – Bergi

Trả lời

21

Mảng được chuyển đổi đến một chuỗi, đi xuống đến .join(), lần lượt kết hợp các phần tử với dấu phẩy ()) làm dấu phân tách.

"-1,1" < "0,0" === true 

vì mã nhân vật của - (45) là nhỏ hơn so với mã nhân vật của 0 (48).

Mặt khác,

"-2" < "-1" === false 

vì các mã nhân vật thứ hai được so sánh (người đầu tiên là cả hai -, vì vậy mà không đưa ra một kết quả nào), và mã ký tự cho 2 (50) là lớn hơn so với mã ký tự của 1 (49), do đó, giá trị này là false.

Nó đi đến một phân loại từ điển (tức là bằng mã ký tự) và không phải là số, ngay cả khi các phần tử là số (do sự ép buộc chuỗi).

Về cơ bản so sánh mảng không được khuyến nghị. Nó được định nghĩa ngầm định là so sánh chuỗi, nhưng điều này có thể mang lại kết quả đáng ngạc nhiên.

+0

vì vậy , '+ [- 2] - + [- 1];' nên thực hiện thủ thuật. – jAndy

+1

@jAndy: Nó sẽ, nhưng sau đó một lần nữa nó chỉ hoạt động độc đáo cho mảng một phần tử. '-2 - 1' sẽ rõ ràng hơn một chút ... – pimvdb

6

Không có điều nào như so sánh mảng JavaScript trong bất kỳ biểu mẫu nào tương tự như những gì bạn mô tả.

Điều xảy ra trong mọi trường hợp là mảng của bạn đang được chuyển đổi đầu tiên thành chuỗi bằng cách nối nội dung của chúng với nhau. Do đó, chuỗi "-2" là không phải là nhỏ hơn chuỗi "-1", vì ký tự "2" xuất hiện sau "1" trong bộ ký tự. Tương tự, "-1,1" nhỏ hơn "0,0" vì ký tự "-" xuất hiện trước các chữ số.

Bạn có thể xem cho chính mình rằng trong mọi trường hợp so sánh của bạn:

array1 < array2 

có được chính xác kết quả tương tự như:

("" + array1) < ("" + array2) 

hay:

array1.join(",") < array2.join(",") 
1

tôi không thể tìm ra câu trả lời về cách thức để thực sự so sánh mảng trong Javascript và nhận được "mong đợi" kết quả, vì vậy đây là mã

compareArrays = function(a, b) { 
    var elA, elB, i, len; 
    for (i = 0, len = Math.min(a.length, b.length); i < len; i++) {    
    elA = a[i], elB = b[i]; 
    if (elA > elB) return 1; 
    if (elA < elB) return -1; 
    } 
    return b.length - a.length; 
}; 

console.log(compareArrays([-2], [-1])) # -1 
console.log(compareArrays([], [])) # 0 
console.log(compareArrays([null], [undefined])) # 0 
console.log(compareArrays([1, 2, 3], [1, 2, 3, 4])) # 1 
console.log(compareArrays([0, 2], [0, 1])) # 1 
console.log(compareArrays([1], [NaN])) # 0 
console.log(compareArrays([NaN], [1])) # 0 
Các vấn đề liên quan