Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как проверить что 3 элемента массива повторяются (https://javascript.ru/forum/misc/70362-kak-proverit-chto-3-ehlementa-massiva-povtoryayutsya.html)

angrypchelka 30.08.2017 19:26

как проверить что 3 элемента массива повторяются
 
мне нужна функция которая будет проверять массив и оставлять в нем все элементы которые повторяются 3 и более раз но перебор с помощью циклов не подходит так как планирую вызывать функцию более 100 раз

рони 30.08.2017 20:02

Цитата:

Сообщение от angrypchelka
перебор с помощью циклов не подходит

интересно узнать другой вариант??? может вы что-то не договариваите?

Alexandroppolus 30.08.2017 20:48

angrypchelka,

а элементы в массиве - какие? строки, числа, объекты?

рони 30.08.2017 20:54

angrypchelka,
http://javascript.ru/forum/misc/6302...v-massive.html

j0hnik 30.08.2017 23:04

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

рони 31.08.2017 00:02

j0hnik,
что делает ваш код ?

j0hnik 31.08.2017 00:06

Цитата:

Сообщение от рони (Сообщение 463176)
j0hnik,
что делает ваш код ?

Рони, если вы какой то косяк заметили, пишите сразу, что интриговать.

j0hnik 31.08.2017 00:06

оставляет в массиве элементы которые повторяются 3 или более раз

рони 31.08.2017 00:59

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)

j0hnik 31.08.2017 01:14

Рони, модифицировал

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

рони 31.08.2017 02:16

j0hnik,
ок, но циклов много

j0hnik 31.08.2017 02:24

Цитата:

Сообщение от рони (Сообщение 463186)
j0hnik,
ок, но циклов много

Если можно сделать шустрей этой, напишите. =)

рони 31.08.2017 02:32

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

j0hnik 31.08.2017 08:15

рони,
Один цикл, но все равно работает медленней чем моя :p

рони 31.08.2017 11:53

j0hnik,
где тест?
и если не трудно сделайте ещё на 10000 одинаковых элементов
и for можно поменять на while или reduce

рони 31.08.2017 12:07

Цитата:

Сообщение от j0hnik
но все равно работает медленней чем моя

ой и это ещё не предел
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);

j0hnik 31.08.2017 12:17

Цитата:

Сообщение от рони (Сообщение 463208)
j0hnik,
где тест?
и если не трудно сделайте ещё на 10000 одинаковых элементов
и for можно поменять на while или reduce

https://jsperf.com/fgfdgertrt

на 10 000 одинаковых? :blink: откуда такие числа
может на 10 000 разных?
for на while шило на мыло, они одинаковые по скорости

j0hnik 31.08.2017 12:35

Цитата:

Сообщение от рони (Сообщение 463208)
j0hnik,
где тест?
и если не трудно сделайте ещё на 10000 одинаковых элементов
и for можно поменять на while или reduce

я понял о чем вы, если много одинаковых то ваш быстрей.

рони 31.08.2017 12:43

j0hnik
можно тест где ваш код быстрее?

j0hnik 31.08.2017 12:47

рони,
https://jsperf.com/fgfdgertrt

рони 31.08.2017 12:59

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 31.08.2017 13:09

рони,
Я за честный спорт, ссылку на сервис вы мне сами когда то дали, им и пользуюсь =)

рони 31.08.2017 13:25

j0hnik,
ок, видимо судья применил допинг (оптимизацию) для вашего кода :)
хорошо бы массив генерировать заново каждый раз.
а так смотрите результат забега в посте №21 :)

j0hnik 31.08.2017 13:30

рони,
ну что вы!
var arr = [], i=100;
while(i--) arr.push(Math.floor(Math.random() * 100));

так честно?
все что, больше лучше ваш.

Vlasenko Fedor 31.08.2017 13:37

Цитата:

Сообщение от j0hnik
return (s>1&&s<=2);

для целых чисел???
за такое сразу по рукам бить надо

рони 31.08.2017 13:38

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")

j0hnik 31.08.2017 13:40

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


для любых

рони 31.08.2017 13:40

Poznakomlus,
точно return s == 2 :)

рони 31.08.2017 13:46

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

j0hnik 31.08.2017 13:49

рони,
спасибо, это я вчера экспериментировал :)

j0hnik 31.08.2017 13:58

рони,
рони, 6 строчка необязательна

рони 31.08.2017 14:33

Цитата:

Сообщение от j0hnik
рони, 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);

j0hnik 31.08.2017 14:34

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

рони 31.08.2017 14:50

Цитата:

Сообщение от j0hnik
Рвет твою

смотрите пост №26

рони 31.08.2017 15:01

j0hnik,
не увидел что вариант "новый"

j0hnik 31.08.2017 15:04

рони,
Рони от условий тоже зависит,
вариант не мой, вконтакте нашел.

рони 31.08.2017 15:11

j0hnik,
спасибо никак не мог вспомнить это
c[el] = (c[el] || 0) + 1;

:thanks:
(b[a]++ || (b[a] = 1))

Vlasenko Fedor 31.08.2017 17:41

let threeF = arr => arr.filter(el => {
  this[el] = ++this[el] || 1;
  return 3 === this[el]
},{})

вариант :dance:

рони 31.08.2017 17:42

Poznakomlus,
:write: this[el] = ++this[el] || 1; записал

рони 31.08.2017 17:51

Poznakomlus,
а если так?
let threeF = arr => arr.filter(el => {
  if(this[el] === 3) return false;
  this[el] = ++this[el] || 1;
  return 3 === this[el]
}, {})


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