удивительное сравнение массивов javascript - PullRequest
22 голосов
/ 30 ноября 2011

Я пытаюсь сравнить два массива в JavaScript.

Что бы я хотел:

a

Таким образом, массивы неотрицательных чисел работают по желанию:

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

И сравнение отрицательных чисел с нулем работает как ожидалось:

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

Но сравнение отрицательных чисел с отрицательными числами ... удивительно:

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

Что здесь происходит, поэтому я могу исправить свою интуицию для того, что сравнение массивов означает в javascript?

Ответы [ 3 ]

23 голосов
/ 30 ноября 2011

Массив преобразуется в строку, которая сводится к .join(), которая в свою очередь объединяет элементы с запятой (,) в качестве разделителя.

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

потому что код из - (45) меньше, чем код из 0 (48).

С другой стороны,

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

потому что сравниваются вторые коды символов (оба являются -, так что результат пока не дает), а код символа для 2 (50) на больше , чем код символа 1 (49), так что получается false.

Это сводится к лексографической сортировке (то есть по кодам символов), а не к числовой, даже если элементы являются числами (из-за приведения строк).

Сравнение массивов не рекомендуется. Он неявно определяется как сравнение строк, но это может привести к неожиданным результатам.

7 голосов
/ 30 ноября 2011

Нет такого понятия, как сравнение массивов JavaScript в любой форме, аналогичной той, которую вы описываете.

Во всех случаях происходит то, что ваши массивы сначала преобразуются в строки, объединяя их содержимое. Таким образом, строка «-2» на не меньше, чем строка «-1», поскольку символ «2» следует после «1» в наборе символов. Точно так же «-1,1» меньше, чем «0,0», потому что символ «-» стоит перед цифрами.

Вы можете убедиться, что во всех случаях ваши сравнения:

array1 < array2

получить точно такие же результаты, как:

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

или

array1.join(",") < array2.join(",")
1 голос
/ 23 июня 2015

Я не смог найти ответ о том, как на самом деле сравнить массивы в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...