Livaanderiamarum,
Дока : function duplicat(b, c) { for (var d = [], e = {},a = 0; a < b.length; a++) e[b[a]]? e[b[a]]++:e[b[a]]=1 ; // создаём обьект c, где ключами являются значения первого массива // e[b[a]]? -> ключ есть ? это на тот случай если значения повторятся в массиве // увеличиваем значение ключа на 1 // иначе если ещё ключа нет с таким значением // создаём ключ со значением 1 for (a = 0; a < c.length; a++) e[c[a]] && d.push(c[a]) && e[c[a]]--; //пробегаемся по второму массиву // смотрим если значение элемента массива среди ключей // нами созданного обьекта и его значение ещё не ноль -> e[c[a]] // если ключ есть, заносим ключ в промежуточный массив d -> d.push(c[a]) // значение самого ключа уменьшаем return d.length == b.length && c.length == b.length // проверяем длину промежуточного массива d c длиной массива b // они должны совпадать -> d.length == b.length // плюс должна совпадать размерность исходных массивов -> c.length == b.length // последнюю проверку можно поставить в начало }; Ок? |
Livaanderiamarum,
Итого ))) function duplicat(b, c) { if(b.length != c.length) return !1; // должна совпадать размерность исходных массивов -> c.length == b.length for (var d = 0, e = {},a = 0; a < b.length; a++) e[b[a]]? e[b[a]]++:e[b[a]]=1 ; // создаём обьект e где ключами являются значения первого массива // e[b[a]]? -> ключ есть ? это на тот случай если значения повторятся в массиве // увеличиваем значение ключа на 1 // иначе если ещё ключа нет с таким значением // создаём ключ со значением 1 for (a = 0; a < c.length; a++) e[c[a]] && d++ && e[c[a]]--; // пробегаемся по второму массиву // смотрим если значение элемента массива среди ключей // нами созданного обьекта и его значение ещё не ноль -> e[c[a]] // если ключ есть, увеличиваем счётчик d -> d++ // значение самого ключа уменьшаем return d == b.length; // проверяем счётчик d c длиной массива b // они должны совпадать -> d == b.length }; |
написано без учёта повторений одинаковых значений в массивах.
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'], b = ['a','b','СТУЛ'], c = ['b','c','a']; alert([compare(a,c), compare(b,c)]); почему я использовал хеши и in ? на хабре увидел статью про то, что время на проверку существования через in во всех браузерах всегда равно нулю :) хотя вместо хеша можно было бы использовать массив первый и indexOf... но это не для IE. |
Ваши решения не учитывают маааленький нюанс - массивы могут быть и такими:
[ 1, '2', function b(){}, {c:d} ] |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
|
Напишите ка умельцы наши функцию быстрее чем моя для ПРОСТО СРАВНЕНИЯ двух массивов, при условии что в них лежат примитивные значения) и при условии что массивы раной длинны не равны. иными словами сравнить массивы игнорируя порядок элементов)
|
Цитата:
Цитата:
Вопрос ко всем - А где выполняется условие: Цитата:
|
Цитата:
ты вообще знаешь этот алгоритм? в чём он заключается и как работает? Цитата:
|
Часовой пояс GMT +3, время: 00:19. |