Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Сравнение массивов JavaScript
Форумы портала PHP.SU » Клиентская разработка » JavaScript & VBScript » Сравнение массивов JavaScript

Страниц (1): [1]
 

1. OrmaJever - 13 Декабря, 2013 - 15:13:12 - перейти к сообщению
Есть 2 массива со строками такого вида
CODE (javascript):
скопировать код в буфер обмена
  1. ['строка1', 'строка2', 'строка3']

Строк может быть разное количество и они могут быть в разном порядке.
CODE (javascript):
скопировать код в буфер обмена
  1. ['строка1', 'строка2', 'строка3'] == ['строка2', 'строка1', 'строка3'] // равны
  2. ['строка1', 'строка2', 'строка3'] == ['строка2', 'строка1', 'строка5'] // не равны
  3. ['строка1', 'строка2', 'строка3'] == ['строка2', 'строка1', 'строка3', 'строка4'] // не равны

Есть ли функция для сравнения? Или может кто-то поможет своей? Растерялся
2. esterio - 13 Декабря, 2013 - 15:27:49 - перейти к сообщению
Не уверен, но навалял
CODE (javascript):
скопировать код в буфер обмена
  1. if (!Array.prototype.indexOf) {
  2.                 Array.prototype.indexOf = function (searchElement , fromIndex) {
  3.                         var i,
  4.                                         pivot = (fromIndex) ? fromIndex : 0,
  5.                                         length;
  6.  
  7.                         if (!this) {
  8.                                 throw new TypeError();
  9.                         }
  10.  
  11.                         length = this.length;
  12.  
  13.                         if (length === 0 || pivot >= length) {
  14.                                 return -1;
  15.                         }
  16.  
  17.                         if (pivot < 0) {
  18.                                 pivot = length - Math.abs(pivot);
  19.                         }
  20.  
  21.                         for (i = pivot; i < length; i++) {
  22.                                 if (this[i] === searchElement) {
  23.                                         return i;
  24.                                 }
  25.                         }
  26.                         return -1;
  27.                 };
  28.         }
  29.  
  30.  
  31.  
  32.  
  33.         function compare(ar1, ar2){
  34.                 if(ar1.length != ar2.length)
  35.                         return false;
  36.  
  37.                 var ar = 0;
  38.                 for(var i = 0; i < ar1.length; i++)
  39.                         ar += (ar2.indexOf(ar1[i]) > -1) ? 1 : 0;
  40.  
  41.                 return (ar == ar1.length);
  42.         }
  43.  
  44.         var ar1 = ['строка1', 'строка2', 'строка3'];
  45.         var ar2 = ['строка2', 'строка1', 'строка5'];
  46.  
  47.         alert(compare(ar1, ar2))
3. OrmaJever - 13 Декабря, 2013 - 15:35:39 - перейти к сообщению
Сразу вопрос, в каких случаях/браузерах не существует Array.prototype.indexOf ? Возможно мне нет смысла переписывать этот метод Закатив глазки
4. esterio - 13 Декабря, 2013 - 16:04:01 - перейти к сообщению
Он будет перезаписан только тогда, когда его не существует. думаю IE<=8 не имеент данного метода(прочем как и другие методы). Сам пример взят отсюда
5. IllusionMH - 13 Декабря, 2013 - 16:10:14 - перейти к сообщению

esterio пишет:
IE<=8 не имеент данного метода

А вот это внезапно Не понял
6. esterio - 13 Декабря, 2013 - 16:46:24 - перейти к сообщению
IllusionMH пишет:
А вот это внезапно

Почему? Если есть, то я же написал, что не уверен. Но раз mozilla пропонует данное решения, то почему бы не воспользоваться им
7. IllusionMH - 13 Декабря, 2013 - 16:49:56 - перейти к сообщению
esterio, я сам полез на MDN смотреть, прежде чем открыл тут(ту же страницу).
Нужно спеку перечитать. Не верится что его только в ES5 добавили.
А если было раньше, то не верится что в 8 его нет.
Ну это так, личные "ощущения".
8. OrmaJever - 13 Декабря, 2013 - 17:10:30 - перейти к сообщению
В общем спасибо. Функция работает.
9. esterio - 13 Декабря, 2013 - 17:35:28 - перейти к сообщению
IllusionMH пишет:
Нужно спеку перечитать

Солидарен, только лень было искать. в caniuse не нашел. Но думаю, что главное то что работает Радость Радость
10. IllusionMH - 13 Декабря, 2013 - 17:52:08 - перейти к сообщению
esterio, еще в спеку не лазил, но все верно.
"MSDN" пишет:
Not supported in the following document modes: Quirks, Internet Explorer 6 standards, Internet Explorer 7 standards, Internet Explorer 8 standards.
11. nerv - 14 Декабря, 2013 - 10:55:48 - перейти к сообщению
esterio пишет:
Не уверен, но навалял

с таким же успехом можно сделать так:
CODE (javascript):
скопировать код в буфер обмена
  1. arr1.sort().toString() === arr2.sort().toString();

Ты бы хоть работу функции прекращал, если элемент не найден.
Сравнение вложенных массивов?

CODE (javascript):
скопировать код в буфер обмена
  1. alert([NaN].indexOf(NaN));


https://github[dot]com/angular/angul[dot][dot][dot]/Angular[dot]js#L809

OrmaJever пишет:
Возможно мне нет смысла переписывать этот метод

https://github[dot]com/kriskowal/es5-shim

Еще такая штука есть
http://lodash[dot]com/docs#difference
или эта функция
http://lodash[dot]com/docs#isEqual

 

Powered by ExBB FM 1.0 RC1