удивительное сравнение массивов javascript

javascript arrays comparison

4245 просмотра

3 ответа

Я пытаюсь сравнить два массива в 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?

Автор: rampion Источник Размещён: 11.11.2019 02:18

Ответы (3)


25 плюса

Решение

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

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

так как код символа из -(45) меньше , чем символов кода из 0(48).

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

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

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

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

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

Автор: pimvdb Размещён: 30.11.2011 04:04

7 плюса

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

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

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

array1 < array2

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

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

или же:

array1.join(",") < array2.join(",")
Автор: Pointy Размещён: 30.11.2011 04:04

1 плюс

Я не смог найти ответ о том, как на самом деле сравнить массивы в 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
Автор: Valentin Nemcev Размещён: 23.06.2015 02:47
Вопросы из категории :
32x32