Сравнительное сравнение javascript
Я пытаюсь сравнить два массива в javascript.
Я бы хотел:
a < b & iff; &существовать; я & ge; 0 s.t. a [i] b [i] и & forall; 0 & le; j < i, a [j] = b [j]
Поэтому массивы неотрицательных чисел работают по желанию:
firebug> [0,1,2,3,4] < [1,0,0]
true
И сравнение отрицательных чисел с нулем работает как ожидалось:
firebug> [-1, 1] < [0, 0]
true
Но сравнение отрицательных чисел с отрицательными числами... suprising:
firebug> [-2] < [-1]
false
firebug> -2 < -1
true
Что происходит здесь, поэтому я могу исправить свою интуицию, для чего сравнение массива означает в javascript?
Ответы
Ответ 1
Массив преобразуется в строку, которая сводится к .join()
, которая, в свою очередь, объединяет элементы с запятой (,
) в качестве разделителя.
"-1,1" < "0,0" === true
потому что код символа -
(45) меньше символьного кода 0
(48).
С другой стороны,
"-2" < "-1" === false
потому что сравниваются коды второго символа (первые - как -
, так что пока не дает результата), а код символа для 2
(50) больше, чем код символа 1
(49), поэтому это дает false
.
Это сводится к лессографической сортировке (то есть по кодам символов), а не к числовому, даже если элементы являются числами (из-за принуждения строки).
В принципе сравнение массивов не рекомендуется. Он неявно определяется как сравнение строк, но это может дать неожиданные результаты.
Ответ 2
Нет такой вещи, как сравнение массива JavaScript в любой форме, подобной тому, что вы описываете.
Что происходит во всех случаях, так это то, что ваши массивы сначала преобразуются в строки, объединяя их содержимое вместе. Таким образом, строка "-2" не меньше строки "-1", потому что символ "2" появляется после "1" в наборе символов. Аналогично, "-1,1" меньше "0,0", потому что символ "-" предшествует цифрам.
Вы сами можете убедиться, что во всех случаях ваши сравнения:
array1 < array2
получают точно такие же результаты, как:
("" + array1) < ("" + array2)
или
array1.join(",") < array2.join(",")
Ответ 3
Я не мог найти ответ о том, как реально сравнивать массивы в Javascript и получать "ожидаемые" результаты, так что вот код
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