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

рони 12.01.2012 19:18

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
    // последнюю проверку можно поставить в начало
};

Ок?

рони 12.01.2012 19:37

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
    };

melky 12.01.2012 19:54

написано без учёта повторений одинаковых значений в массивах.

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.

Aetae 12.01.2012 20:20

Ваши решения не учитывают маааленький нюанс - массивы могут быть и такими:
[ 1, '2', function b(){}, {c:d} ]

melky 12.01.2012 20:29

Цитата:

Сообщение от Aetae (Сообщение 149954)
Ваши решения не учитывают маааленький нюанс - массивы могут быть и такими:
[ 1, '2', function b(){}, {c:d} ]

условия :
Цитата:

Сообщение от bohdantheone (Сообщение 149810)
1) размеры массивов могут отличаться - да
2) у тя в них только строки будут - да
3) строки могут быть одинаковые -да
4) что в твоем понимании ПОХОЖИЕ - id1=id1


Livaanderiamarum 12.01.2012 20:52

Цитата:

Сообщение от Aetae (Сообщение 149954)
Ваши решения не учитывают маааленький нюанс - массивы могут быть и такими:
[ 1, '2', function b(){}, {c:d} ]

ПО этому я и не использовал метод зансения ЗНАЧЕНИЙ в ИМЕНА свойств обьекта, хотя это была первая мысль. Да и делал функцию не для Опа, а для развлечения скорее.

Livaanderiamarum 12.01.2012 20:55

Цитата:

Сообщение от melky (Сообщение 149935)
я сделал так :

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

    var i = 0, a = {};
    // заносим в хеш значения первого массива.
    while(i in arr1) {
        a[arr1[i++]] = undefined;    
    }
    // проходимся по элементам второго массива
    // если значения нет в хеше (т.е. нет в первом массиве, то сразу возвращается 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)]);

Метод пузырька )) только в методе пузырька итераций меньше и можно сравнивать НЕ ТОЛЬКО строки))

Livaanderiamarum 12.01.2012 21:08

Напишите ка умельцы наши функцию быстрее чем моя для ПРОСТО СРАВНЕНИЯ двух массивов, при условии что в них лежат примитивные значения) и при условии что массивы раной длинны не равны. иными словами сравнить массивы игнорируя порядок элементов)

Gozar 12.01.2012 21:21

Цитата:

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

Чем тебя не устроила реализация:
Цитата:

indexOf is a recent addition to the ECMA-262 standard
данная по ссылке?

Вопрос ко всем - А где выполняется условие:
Цитата:

Сообщение от bohdantheone (Сообщение 149811)
итоговый вариант - выбранные сообщения будут удалятся

true false насколько я понял вообще не нужны ТС.

melky 12.01.2012 21:30

Цитата:

Сообщение от Livaanderiamarum (Сообщение 149971)
Метод пузырька )) только в методе пузырька итераций меньше и можно сравнивать НЕ ТОЛЬКО строки))

специально для тебя апнул ту функцию. если на одинаковых позициях будут стоять одинаковые элементы, то количество итераций во втором цикле уменьшится.

ты вообще знаешь этот алгоритм? в чём он заключается и как работает?

Цитата:

Сообщение от Gozar (Сообщение 149981)
true false насколько я понял вообще не нужны ТС.

верно.. но данная тема уже страницу назад переросла из совета в очередное испытание меряние.


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