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)]);


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