12.01.2012, 19:18
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
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
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
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
};
|
|
12.01.2012, 19:54
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
написано без учёта повторений одинаковых значений в массивах.
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.
Последний раз редактировалось melky, 12.01.2012 в 21:49.
|
|
12.01.2012, 20:20
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,590
|
|
Ваши решения не учитывают маааленький нюанс - массивы могут быть и такими:
[ 1, '2', function b(){}, {c:d} ]
__________________
29375, 35
|
|
12.01.2012, 20:29
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от Aetae
|
Ваши решения не учитывают маааленький нюанс - массивы могут быть и такими:
[ 1, '2', function b(){}, {c:d} ]
|
условия :
Сообщение от bohdantheone
|
1) размеры массивов могут отличаться - да
2) у тя в них только строки будут - да
3) строки могут быть одинаковые -да
4) что в твоем понимании ПОХОЖИЕ - id1=id1
|
|
|
12.01.2012, 20:52
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Сообщение от Aetae
|
Ваши решения не учитывают маааленький нюанс - массивы могут быть и такими:
[ 1, '2', function b(){}, {c:d} ]
|
ПО этому я и не использовал метод зансения ЗНАЧЕНИЙ в ИМЕНА свойств обьекта, хотя это была первая мысль. Да и делал функцию не для Опа, а для развлечения скорее.
|
|
12.01.2012, 20:55
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Сообщение от melky
|
я сделал так :
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)]);
|
Метод пузырька )) только в методе пузырька итераций меньше и можно сравнивать НЕ ТОЛЬКО строки))
|
|
12.01.2012, 21:08
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Напишите ка умельцы наши функцию быстрее чем моя для ПРОСТО СРАВНЕНИЯ двух массивов, при условии что в них лежат примитивные значения) и при условии что массивы раной длинны не равны. иными словами сравнить массивы игнорируя порядок элементов)
|
|
12.01.2012, 21:21
|
|
猫
|
|
Регистрация: 07.06.2007
Сообщений: 7,504
|
|
Сообщение от nerv_
|
Могу ошибаться, но этот вариант в IE работать не будет.
|
Чем тебя не устроила реализация:
Цитата:
|
indexOf is a recent addition to the ECMA-262 standard
|
данная по ссылке?
Вопрос ко всем - А где выполняется условие:
Сообщение от bohdantheone
|
итоговый вариант - выбранные сообщения будут удалятся
|
true false насколько я понял вообще не нужны ТС.
__________________
Последний раз редактировалось Gozar, Сегодня в 24:14.
|
|
12.01.2012, 21:30
|
sinistral
|
|
Регистрация: 28.03.2011
Сообщений: 5,418
|
|
Сообщение от Livaanderiamarum
|
Метод пузырька )) только в методе пузырька итераций меньше и можно сравнивать НЕ ТОЛЬКО строки))
|
специально для тебя апнул ту функцию. если на одинаковых позициях будут стоять одинаковые элементы, то количество итераций во втором цикле уменьшится.
ты вообще знаешь этот алгоритм? в чём он заключается и как работает?
Сообщение от Gozar
|
true false насколько я понял вообще не нужны ТС.
|
верно.. но данная тема уже страницу назад переросла из совета в очередное испытание меряние.
Последний раз редактировалось melky, 12.01.2012 в 21:36.
|
|
|
|