Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сравнить два массива (https://javascript.ru/forum/misc/24735-sravnit-dva-massiva.html)

рони 12.01.2012 21:37

Цитата:

Сообщение от melky
3) строки могут быть одинаковые -да

function compare(arr1, arr2){
    if(arr1.length !== arr2.length) return false;

    var i = 0, a = {};
    // заносим в хеш значения первого массива.
    while(i in arr1) {
        // если на одинаковых позициях стоят одинаковые элементы, то зачем их проверять дальше?
        if(arr1[i] !== arr2[i])
            a[arr1[i]] = undefined;
        i += 1;
    }
    // проходимся по элементам второго массива
    // если значения нет в хеше (т.е. нет в первом массиве, то сразу возвращается false
    while(i--) if(!(arr2[i] in a)) return false;
    // массивы похожи
    return true;
};

var a = ['a','b','c','c'], c = ['b','c','a','a'];
alert( compare(a,c));//true ??

melky 12.01.2012 21:47

рони, ого. спасибо, что нашли. мой алгоритм не представляет нормального решения для этого. только, если ввести числа вхождений в массив. но это уже ваш код.

nerv_ 12.01.2012 22:34

рони, я мож чего не понимаю, но почему эти два массива равны? ['a','b','c','c'] и ['b','c','a','a']
var a = ['a','b','c','c'], c = ['b','c','a','a'];

Gozar, я не говорил, что она меня не устроила. Я сказал, что в IE работать не будет.
melky, тему с ходу не нашел, но за JSDoc спасибо)

За переделку извиняюсь. Первое, что пришло в голову (мог накосячить, голова к вечеру не варит)

function arrComp(x, z) {
	if(x.length !== z.length) return false;

	var i = 0, a = {};
	
	while(i in x) {
		if(x[i] !== z[i]) x[i] in a ? a[x[i]]++ : a[x[i]] = 1;
		i++;
	}
	
	while(i--) if(z[i] in a) if(--a[z[i]] < 0) return false;
	return true;
};

var a = ['a','b','c','c'], c = ['b','c','a','a'];
alert(arrComp(a,c)); // false

var a = ['c','b','a','d','a'], c = ['a','d','c','a','b'];
alert(arrComp(a,c)); // true

рони 12.01.2012 23:01

Цитата:

Сообщение от nerv_
рони, я мож чего не понимаю, но почему эти два массива равны? ['a','b','c','c'] и ['b','c','a','a']

Потому что функция melky не учитывала число вхождений одинаковых элементов и смотрите ответ его выше

рони 12.01.2012 23:10

Оптимальный вариант )))
function compare(arr1, arr2){
    if(arr1.length !== arr2.length) return false;
    arr1.sort();
    arr2.sort();
    var i = arr1.length;
    while(i--) if(arr1[i] !== arr2[i]) return false;
    return true;
};
var a = ['a','b','c','c'], c = ['b','c','a','a'], d = ['b','c','c','a'];
alert([compare(a,c),compare(a,d)]);

Gozar 12.01.2012 23:13

Цитата:

Сообщение от nerv_ (Сообщение 149994)
Gozar, я не говорил, что она меня не устроила. Я сказал, что в IE работать не будет.

Что же ей помешает работать в IE? Может быть прилетят инопланетяне и похитят мозг пользователя?

Будет всё работать в IE.

Прочитай внимательно моё первое сообщение!

Livaanderiamarum 12.01.2012 23:43

Что-то мою функцию еще ни кто не переплюнул я смотрю))
Что, неужели ни чего лучше моего брутфорса у вас не получается?
ЛИЧНО у меня больше идей - нет! По этому так и сделал)

Gozar 12.01.2012 23:52

Цитата:

Сообщение от Livaanderiamarum (Сообщение 150003)
Что-то мою функцию еще ни кто не переплюнул я смотрю))

А нафига? У меня даже функции нет, а три строчки кода делающие то, что нужно в общепонятном виде.

Велосипеды изобретать весело только изобретателям велосипедов.

Для сравнения массива из пяти элементов брутфорсы не нужны. Там где есть родной indexOf будет работать весело, там где нет родного, чуть медленнее. Вопрос в том: - заметит ли пользователь эту разницу в мс?

Livaanderiamarum 13.01.2012 01:02

Цитата:

Сообщение от Gozar (Сообщение 150005)
А нафига? У меня даже функции нет, а три строчки кода делающие то, что нужно в общепонятном виде.

Велосипеды изобретать весело только изобретателям велосипедов.

Для сравнения массива из пяти элементов брутфорсы не нужны. Там где есть родной indexOf будет работать весело, там где нет родного, чуть медленнее. Вопрос в том: - заметит ли пользователь эту разницу в мс?

Вопрос в том кто как оправдается...

рони 13.01.2012 01:19

Ещё самокат ))) ...:write:
function compare(arr1, arr2){
    if(arr1.length !== arr2.length) return false;
    arr1.sort();
    arr2.sort();
    var i = Math.random();
    return arr1.join(i) == arr2.join(i)  ;
};
var a = ['a','b','c','c'], c = ['b','c','a','a'], d = ['b','c','c','a'];
alert([compare(a,c),compare(a,d)]);

trikadin 13.01.2012 01:40

Цитата:

Сообщение от рони
var i = Math.random();

А зачем это? Просто join("") не?

И в минусы можно записать, что модифицируются исходные массивы.

Livaanderiamarum 13.01.2012 02:10

Цитата:

Сообщение от trikadin (Сообщение 150027)
А зачем это? Просто join("") не?

я кстати тоже не втулил

рони 13.01.2012 02:54

Цитата:

Сообщение от trikadin
Просто join("") не?

var a = ['1','2,3'].join(),
   b = ['1,2','3'].join();
   alert(a == b)

var a = ['1','23'].join(''),
   b = ['12','3'].join('');
   alert(a == b)

trikadin 13.01.2012 04:15

Ну да, логично.

Livaanderiamarum 13.01.2012 04:32

join() без параметров соединяет запятыми! Это МЕДЛЕННЕЕ чем соединять пустой строкой!

trikadin 13.01.2012 05:16

Цитата:

Сообщение от Livaanderiamarum
join() без параметров соединяет запятыми! Это МЕДЛЕННЕЕ чем соединять пустой строкой!

Нет)

Причина не в этом, рони уже всё объяснил. И вообще, я считаю, что тему пора закрывать.

nerv_ 13.01.2012 09:41

Цитата:

Сообщение от рони
Потому что функция melky не учитывала число вхождений одинаковых элементов и смотрите ответ его выше

Прошу прощения, день выдался суетной, после работы голова не варила)
Цитата:

Сообщение от Gozar
Будет всё работать в IE.

IE8 - error: Не удалось завершить действие.

p.s.: очень часто наблю даю забавную ситуацию:
товарищ по нику Livaanderiamarum делает какое-либо голословное утверждение, и его опровергают в следующем же посте :)
Цитата:

Сообщение от Livaanderiamarum
join() без параметров соединяет запятыми! Это МЕДЛЕННЕЕ чем соединять пустой строкой!

Цитата:

Сообщение от trikadin
Нет)


Livaanderiamarum 13.01.2012 09:51

я тоже это наблюдаю)

Gozar 13.01.2012 12:14

Цитата:

Сообщение от nerv_ (Сообщение 150079)
IE8 - error: Не удалось завершить действие.

Ошибок нет. Проверено IE7, IE8. В IE9 - родная поддержка. Ищи то, что ты делаешь неправильно.

nerv_ 13.01.2012 15:13

Gozar, я просто открываю IE8 и кликаю по кнопке запустить из вашего поста. Тут сложно сделать что-либо неправильно)

Gozar 13.01.2012 16:02

Цитата:

Сообщение от nerv_ (Сообщение 150129)
Gozar, я просто открываю IE8 и кликаю по кнопке запустить из вашего поста. Тут сложно сделать что-либо неправильно)

Однако ты делаешь неправильно. Что не удивительно, если упереться рогами и не читать того, что тебе пишут.

Цитата:

Сообщение от Gozar (Сообщение 149861)
indexOf реализация для массивов и строк можно взять тут

Это цитата из первого моего сообщения в этой теме, на которое я тебе неоднократно указывал.

Быть упрямым не кавайно.

nerv_ 13.01.2012 20:51

Цитата:

Сообщение от Gozar
Быть упрямым

что есть, то есть :yes:
Цитата:

Сообщение от nerv_
Могу ошибаться, но этот вариант в IE работать не будет.

Подразумевался пример приведенный Вами на странице, в том виде, котором он есть.
Цитата:

Сообщение от Gozar
Прочитай внимательно моё первое сообщение!

А тут не въехал, что мы с Вами говорим о разных вещах :D Вообщем, сори :)

Snus 26.09.2015 09:34

Все проще простого.

function array_equal ( a, b )
{

   if ( a.length != b.length ) return false;
   
   a.sort();
   b.sort();
   
   for ( var i in a )
   {
   
      if ( a[i] != b[i] ) return false;
   
   }
   
   return true;

};

EmperioAf 26.09.2015 09:53

Цитата:

Сообщение от Snus
Все проще простого.

function array_equal ( a, b ) {
 
   if ( a.length != b.length ) return false;
    
   a.sort();
   b.sort();
    
   for ( var i in a ) {
      if ( a[i] != b[i] ) return false;
   }
   return true;
};
alert(array_equal([1,2], ['1','2']));

nerv_ 26.09.2015 10:25

некропостинг :)

EmperioAf, даже этого не надо. Я дальше

a.sort();
b.sort();


не читал, т.к. порядок элементов в массиве измениться.

Deff 26.09.2015 20:10

function array_equal ( a, b ) {
  return  a.join('\n&\n') == b.join('\n&\n') ;
}

рони 26.09.2015 20:31

Deff,
:-?
function array_equal ( a, b ) {
  return  a.join('\n&\n') == b.join('\n&\n') ;
}
var a;
alert([array_equal ( [a], [] ),[a].length,[].length]);
alert(array_equal ( ['1'], [[1]] ));

Vlasenko Fedor 26.09.2015 20:51

var a = [1,2,3];
var b = [1,2,3];
var c = [[1,2,3]];

alert(JSON.stringify(a) == JSON.stringify(b));
alert(JSON.stringify(a) == JSON.stringify(c));

nerv_ 26.09.2015 22:20

Poznakomlus,
alert(JSON.stringify([Array]) === JSON.stringify([null]));

Vlasenko Fedor 26.09.2015 22:38

nerv_, согласен +(не могу)
var a = [1,2,3];
var b = [1,2,3];
var c = [];
var d = [Array];
var e =[null];
function array_equal ( a, b ) {
    return a.every(function(el, i){
        return el === b[i];
    }, b);
}

alert(array_equal ( a, b ));
alert(array_equal ( a, c ));
alert(array_equal ( d, e ));

nerv_ 26.09.2015 22:54

Poznakomlus,
var a = [1,2,3];
var b = [1,2,3,4,5,6];

function array_equal ( a, b ) {
    return a.every(function(el, i){
        return el == b[i];
    }, b);
}

alert(array_equal ( a, b ));

Vlasenko Fedor 26.09.2015 23:03

Не внимателен в последнее время :thanks:
var a = [1, 2, 3];
var b = [1, 2, 3, 4, 5, 6];
var c = [1, 2, 3, 4, 5, 6];

function array_equal(a, b) {
    return a.length == b.length
        ? a.every(function (el, i) {
            return el === b[i];
        }, b)
        : false;
}

alert(array_equal(a, b));
alert(array_equal(c, b));

Deff 27.09.2015 01:12

рони,
Мну тупо про простой массив, без переменных
[1,2,3,"b","c"]
======
Почитал первопост, и чуть дальше понял, чо хотят премудростей... ну нафиг...

SergeyGG 21.10.2015 17:14

arrayEqual = (arr1,arr2)->
    i = arr1.length
    myBool
    while(i--)
        if arr1[i] == arr2[i]
            myBool = true
        else
            i = 0
            myBool = false
    return myBool

Jekshmek 04.01.2018 15:35

[1,2,3].toString() === '1,2,3'
 
let arr1=[1,2,3,4,5];
let arr2=[2,1,4,5,3];
console.log(arr1.sort().toString()==arr2.sort().to String());// true

рони 04.01.2018 16:10

Jekshmek,
:-? а тему прочитать? можно отсюда https://javascript.ru/forum/misc/247...tml#post150022 и далее
alert([1,"2,3"].toString() === [1,2,3].toString());

Aetae 04.01.2018 16:33

Для строк нормальный вариант во всей теме только этот.
А не для строк, увы, не всё так просто:
a={a:1};
b={b:2};

arr1 = [2, 3, a, b, 1];
arr2 = [2, 3, b, a, 1];
alert(JSON.stringify(
  [arr1.sort(), arr2.sort()]
,0,'\t'))

j0hnik 07.02.2018 00:37

func=(a,b)=>{
		b=b.sort();
		return !a.sort().some((el,i)=>el !== b[i]);
	};
alert(func([12, 5, 8, 44, 130,],[12, 5, 8, 130, 44]));

рони 07.02.2018 09:54

j0hnik,
где сравнение length и может every вместо some

j0hnik 07.02.2018 10:04

https://javascript.ru/forum/misc/247...tml#post389872 есть такой

А я так для разнообразия запостил.


Часовой пояс GMT +3, время: 19:58.