как проверить что 3 элемента массива повторяются
мне нужна функция которая будет проверять массив и оставлять в нем все элементы которые повторяются 3 и более раз но перебор с помощью циклов не подходит так как планирую вызывать функцию более 100 раз
|
Цитата:
|
angrypchelka,
а элементы в массиве - какие? строки, числа, объекты? |
angrypchelka,
http://javascript.ru/forum/misc/6302...v-massive.html |
var arr = [9, 9, 9, 111, 5, 2, 5, 3, 4, 4, 5, 7]; arr=arr.filter((el, i)=> { var s = 0; while (i--) if (el == arr[i]) s++; return (s>1&&s<=2); }); alert(arr); |
j0hnik,
что делает ваш код ? |
Цитата:
|
оставляет в массиве элементы которые повторяются 3 или более раз
|
j0hnik,
var arr = [9, 9, 9, 111, 5, 2, 3, 4, 4, 5, 5,5,7]; arr=arr.filter((el, i)=> { var s = 0; while (i--) if (el == arr[i]) s++; return (s>1); }); alert(arr) |
Рони, модифицировал
function three(arr){ return arr.filter((el, i)=> { var s = 0; while (i--) if (el == arr[i]) s++; return (s>1&&s<=2); }); } alert(three([9, 9, 9, 111, 5, 2, 3, 4, 4, 5, 5,5,7])); |
j0hnik,
ок, но циклов много |
Цитата:
|
j0hnik,
один цикл var arr = [9, 9, 9, 111, 5, 2, 3, 4, 4, 5, 5, 5, 7]; function fn(d, e) { for (var f = [], b = {}, a, c = 0; c < d.length; c++) a = d[c], b[a] >= e || (b[a]++ || (b[a] = 1), b[a] >= e && f.push(a)); return f }; alert(fn(arr, 3)); |
рони,
Один цикл, но все равно работает медленней чем моя :p |
j0hnik,
где тест? и если не трудно сделайте ещё на 10000 одинаковых элементов и for можно поменять на while или reduce |
Цитата:
var arr = new Array(10000).fill(1); function fn(d, e) { for (var f = [], b = {}, a, c = 0; c < d.length; c++) a = d[c], b[a] == e || (b[a]++ || (b[a] = 1), b[a] == e && f.push(a)); return f }; console.time("x") var x = fn(arr, 3); console.timeEnd("x") alert(x); function three(arr){ return arr.filter((el, i)=> { var s = 0; while (i--) if (el == arr[i]) s++; return (s>1&&s<=2); }); } console.time("k") var k = three(arr); console.timeEnd("k") alert(k); |
Цитата:
на 10 000 одинаковых? :blink: откуда такие числа может на 10 000 разных? for на while шило на мыло, они одинаковые по скорости |
Цитата:
|
j0hnik
можно тест где ваш код быстрее? |
|
j0hnik,
спасибо, но не может быть, чтобы мой цикл длиной скажем в 10 символов был медленнее вашего на 50. var arr = [127,3627,65,58,8527,87,1365,1,27,47,7,89,55,11,2727,3636,4747,77,88,556,66,78,55,4747,6,8,47,7,5,67,47,36,475,678,4736,272747,56,7,5,36,27,47,3627,271,27,477,9547,88,3678,156,875,1275,1475,98,751,27547,2756,1547,785,1276,1477,2758,3669,4756,789,12736,12736,4758,785,1275,1475,6547,785,9547,789,156,12747,12747,12747,127547,178,1547,1547,78,69,75,12751,785,987,5477,5477,58,16,178,198,1477,1477,3657,5471,4747,47478,6476,87647,865,5477,587,87,9,6,5,47,8,5,536,568,6847,689,515,789,12756,1547,1475,7471,2758,63627,847,1275,627,58,86,476,127,5727,6547,1477,5366,27477,3669,1547,2775,471,275,98,87,547,271,3627,65,98,87,547,275,366,147,7478,58,96,59,475,65,81,581,1277,157,178,1475,1277,118,117,1477,1471,785,5477,1477,1478,1275,14747,1471,711,4771,4755,175,175,117,6547,1477,1477,7547,175,156,86,547,547,85,88,7,85,85,747,55,8475,75,475,85,87,7475,55,75,55]; function fn(d, e) { for (var f = [], b = {}, a, c = 0; c < d.length; c++) a = d[c], b[a] == e || (b[a]++ || (b[a] = 1), b[a] == e && f.push(a)); return f }; console.time("x") var x = fn(arr, 3); console.timeEnd("x") alert(x); function three(arr){ return arr.filter((el, i)=> { var s = 0; while (i--) if (el == arr[i]) s++; return (s>1&&s<=2); }); } console.time("k") var k = three(arr); console.timeEnd("k") alert(k); |
рони,
Я за честный спорт, ссылку на сервис вы мне сами когда то дали, им и пользуюсь =) |
j0hnik,
ок, видимо судья применил допинг (оптимизацию) для вашего кода :) хорошо бы массив генерировать заново каждый раз. а так смотрите результат забега в посте №21 :) |
рони,
ну что вы! var arr = [], i=100; while(i--) arr.push(Math.floor(Math.random() * 100)); так честно? все что, больше лучше ваш. |
Цитата:
за такое сразу по рукам бить надо |
j0hnik,
function fn(d, e) { for (var f = [], b = {}, a, c = 0; c < d.length; c++) a = d[c], b[a] == e || (b[a]++ || (b[a] = 1), b[a] == e && f.push(a)); return f }; console.time("x") for (var k=0; k<10000; k++) { var arr = [], i=100; while(i--) arr.push(Math.floor(Math.random() * 100)); fn(arr, 3) } console.timeEnd("x") function three(arr){ return arr.filter((el, i)=> { var s = 0; while (i--) if (el == arr[i]) s++; return (s>1&&s<=2); }); } console.time("k") for (var k=0; k<10000; k++) { var arr = [], i=100; while(i--) arr.push(Math.floor(Math.random() * 100)); three(arr) } console.timeEnd("k") |
Poznakomlus,
function three(arr){ return arr.filter((el, i)=> { var s = 0; while (i--) if (el == arr[i]) s++; return (s>1&&s<=2); }); } console.log(three([5.6,435,5,6,5.3,5.6,5.6])); для любых |
Poznakomlus,
точно return s == 2 :) |
j0hnik,
небольшое изменение function three(arr){ return arr.filter((el, i)=> { var s = 0; while (i--) { if (el == arr[i]) s++; if (s > 2)return false } return s == 2; }); } |
рони,
спасибо, это я вчера экспериментировал :) |
рони,
рони, 6 строчка необязательна |
Цитата:
var arr = new Array(10000).fill(1) function threeSix(arr){ return arr.filter((el, i)=> { var s = 0; while (i--) { if (el == arr[i]) s++; if (s > 2)return false } return s == 2; }); } console.time("x") var x = threeSix(arr); console.timeEnd("x") alert(x); function three(arr){ return arr.filter((el, i)=> { var s = 0; while (i--) { if (el == arr[i]) s++; } return s == 2; }); } console.time("k") var k = three(arr); console.timeEnd("k") alert(k); |
https://jsperf.com/fdgd5t
Рони друг мой var arr = [], i=1000; while(i--) arr.push(Math.floor(Math.random() * 1000)); function three(arr){ return arr.filter((function() { var c = {}; return function(el) { c[el] = (c[el] || 0) + 1; return c[el] == 3; }; })()); } console.log(three(arr)); Рвет твою :p |
Цитата:
|
j0hnik,
не увидел что вариант "новый" |
рони,
Рони от условий тоже зависит, вариант не мой, вконтакте нашел. |
j0hnik,
спасибо никак не мог вспомнить это c[el] = (c[el] || 0) + 1; :thanks: (b[a]++ || (b[a] = 1)) |
let threeF = arr => arr.filter(el => { this[el] = ++this[el] || 1; return 3 === this[el] },{}) вариант :dance: |
Poznakomlus,
:write: this[el] = ++this[el] || 1; записал |
Poznakomlus,
а если так? let threeF = arr => arr.filter(el => { if(this[el] === 3) return false; this[el] = ++this[el] || 1; return 3 === this[el] }, {}) |
Часовой пояс GMT +3, время: 01:45. |