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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сравнение массивов JavaScript

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
OrmaJever
Отправлено: 13 Декабря, 2013 - 15:13:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Есть 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'] // не равны

Есть ли функция для сравнения? Или может кто-то поможет своей? Растерялся


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
esterio
Отправлено: 13 Декабря, 2013 - 15:27:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Не уверен, но навалял
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))
 
 Top
OrmaJever
Отправлено: 13 Декабря, 2013 - 15:35:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




Сразу вопрос, в каких случаях/браузерах не существует Array.prototype.indexOf ? Возможно мне нет смысла переписывать этот метод Закатив глазки


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
esterio
Отправлено: 13 Декабря, 2013 - 16:04:01
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




Он будет перезаписан только тогда, когда его не существует. думаю IE<=8 не имеент данного метода(прочем как и другие методы). Сам пример взят отсюда

(Отредактировано автором: 13 Декабря, 2013 - 16:04:56)

 
 Top
IllusionMH
Отправлено: 13 Декабря, 2013 - 16:10:14
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)





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

А вот это внезапно Не понял
 
 Top
esterio
Отправлено: 13 Декабря, 2013 - 16:46:24
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




IllusionMH пишет:
А вот это внезапно

Почему? Если есть, то я же написал, что не уверен. Но раз mozilla пропонует данное решения, то почему бы не воспользоваться им

(Отредактировано автором: 13 Декабря, 2013 - 16:47:09)

 
 Top
IllusionMH
Отправлено: 13 Декабря, 2013 - 16:49:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




esterio, я сам полез на MDN смотреть, прежде чем открыл тут(ту же страницу).
Нужно спеку перечитать. Не верится что его только в ES5 добавили.
А если было раньше, то не верится что в 8 его нет.
Ну это так, личные "ощущения".

(Отредактировано автором: 13 Декабря, 2013 - 16:50:44)

 
 Top
OrmaJever
Отправлено: 13 Декабря, 2013 - 17:10:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




В общем спасибо. Функция работает.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
esterio
Отправлено: 13 Декабря, 2013 - 17:35:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




IllusionMH пишет:
Нужно спеку перечитать

Солидарен, только лень было искать. в caniuse не нашел. Но думаю, что главное то что работает Радость Радость
 
 Top
IllusionMH
Отправлено: 13 Декабря, 2013 - 17:52:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




esterio, еще в спеку не лазил, но все верно.
"MSDN" пишет:
Not supported in the following document modes: Quirks, Internet Explorer 6 standards, Internet Explorer 7 standards, Internet Explorer 8 standards.
 
 Top
nerv
Отправлено: 14 Декабря, 2013 - 10:55:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 407
Дата рег-ции: Февр. 2013  
Откуда: Россия


Помог: 9 раз(а)




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.com/docs#isEqual

(Отредактировано автором: 14 Декабря, 2013 - 11:05:20)



-----
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB