Подтвердить что ты не робот

Сравнительное сравнение 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?

4b9b3361

Ответ 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