Найти тройные дубликаты в массиве
Добрый день.
Нужно найти тройные дубликаты в массиве. Код function myFunction() { var arr = [9, 9, 9, 111, 2, 3, 4, 4, 5, 7]; var sorted_arr = arr.slice().sort(); var results = []; for (var i = 0; i < arr.length - 1; i++) { if (sorted_arr[i + 1] == sorted_arr[i] == sorted_arr[i+2]) { results.push(sorted_arr[i]); } } alert(results); }с тройными не работает. Этот, тоже, не работает. function myFunction() { var fruits = [3, 3, 3, 5, 4, 6, 8, 9]; var a = fruits.sort(); document.getElementById("demo").innerHTML = a; for(var i = 0, j = 1, k = 2; i < fruits.length, j < fruits.length, k < fruits.length; i++, j++, k++){ if(fruits[i].valueOf() == fruits[j].valueOf() == fruits[k].valueOf()){ alert(fruits[i].valueOf()+" "+fruits[j].valueOf() +" "+fruits[k].valueOf()); } } } |
var arr = [9, 9, 9, 111, 5, 2, 5, 3, 4, 4, 5, 7], count = []; for (var i = 0; i < arr.length; i++) { count[arr[i]]= (count[arr[i]] | 0) + 1; } count.forEach(function(item, j, array) { if (item==3) { alert( j ); } }); Или дубликаты - когда подряд? |
Dilettante_Pro,
Спасибо. Для облегчения поиска дубликатов, делала сортировку. |
Вариант.
<script src="http://underscorejs.ru/underscore-min.js"></script> <script> _.chain([9, 9, 9, 111, 5, 2, 5, 3, 4, 4, 5, 7]) .countBy() .each( (val, key) => (val === 3) && (alert(key))) </script> |
без повтора и двойные, тройные, четверные ... в массиве
:)
<script> var arr = [9, 9, 9, 111, 5, 2, 5, 3, 4, 4, 5, 7]; function foo(a, c) { c--; var d = {}; return a.filter(function(b, e, a) { if (d[b]) return !1; d[b] = !0; for (var f = 0; ~(e = a.indexOf(b, ++e));) f++; return f == c }) }; document.write(JSON.stringify(foo(arr,1)) + "<br>")//без повтора document.write(JSON.stringify(foo(arr,3)))// тройные дубликаты </script> |
рони,
Реальность такова, что мой вариант быстрее и красивее :D |
destus, да, но там нужно грузить библиотеку. А у меня вся программа на чистом JS.
|
Dilettante_Pro,
опухнет же массив count :-? destus, может и быстрее , но грузить библиотеку предварительно и конвертировать полученный результат. |
Цитата:
Цитата:
Underscore - вне закона и должна быть на каждом большом проекте :) |
Кто-нибудь знает, почему мой код не работает?
|
Blondinka,
Цитата:
|
destus,
Писала на jQuery. 1. Столкнулась с тем, что не могу ничего написать без него. 2. Писала свой "большой проект" на jQuery и в один прекрасный день, он не запустился. Использовала CDN. Наверно, они там что-то обновили. Было очень обидно. 3. Часто встречаю выражение "джейквэримонки". Наверно, jQuery - зло. Подобное 1 раз встречала, по отношению к React. Пришла к выводу, что не стоит привыкать к библиотекам. |
рони,
почему? |
Blondinka, код будет верным если более 3 повторов в массиве нет, типа 1,1,1,1 иначе нужно менять алгоритм или использовать вариант предложенный выше
function myFunction() { var arr = [9, 9, 9, 111, 5, 2, 5, 3, 4, 4, 5, 7]; var sorted_arr = arr.slice().sort(function(a,b) { return b - a }); var results = []; for (var i = 0; i < arr.length - 2; i++) { if (sorted_arr[i + 1] == sorted_arr[i] && sorted_arr[i] == sorted_arr[i+2]) { results.push(sorted_arr[i]); } } alert(results); } myFunction() |
Цитата:
|
destus, откуда мне это было знать? Но тогда это был мой большой пет-проект. Сейчас я уже знаю, о существовании Bower/npm но не понимаю, как этим пользоваться.
|
var arr = [9, 9, 9, 111, 5, 2, 5, 3, 4, 4, 5, 7]; var res = arr.filter(function(value, index){ return index != arr.indexOf(value) && index != arr.lastIndexOf(value); }); alert(res); |
А что, если я хочу получить последовательность. Скажем, [2, 3, 4] ?
|
Цитата:
|
рони,
тот же массив [9, 9, 9, 111, 5, 2, 5, 3, 4, 4, 5, 7] - > sort() Результат - первая последовательность из трёх чисел - [2, 3, 4] |
Blondinka,
не понял ничего. |
рони,
var arr = [1, 2, 3, 4, 5]; for (var i = 0; i < arr.length; i++) { /*Magic*/ } alert(result); //1,2,3 ||2,3,4 || 3,4,5 Результат - первая последовательность из трёх чисел. |
Blondinka,
нашли и что в результате true или false? или как |
Цитата:
var arr = [9, 9, 9, 111, 5, 2, 5, 3, 4, 4, 5, 7]; var res = arr.sort(function(a, b){return a > b ? 1: a==b ? 0: -1}).slice(0, 3); alert(res); |
рони,
в результате массив чисел. |
Poznakomlus,
почти. Разница между числами должна быть 1. Например, из массива [1, 2, 4, 5, 6] результат будет [4,5,6], т.к. разница между этими числами == 1. |
Цитата:
|
Blondinka,
а как вы разницу считаите? |
рони,
Другими словами: у меня есть таблица. У каждой ячейки - числовой id. Мне нужно получить 3 пустых ячейки, которые идут подряд. Пользователь не заполнил 3 ячейки подряд? Отправить в ад!:p |
Blondinka,
то есть это массив незаполненных ячеек ? тогда почему id повторяются |
рони,
да, но только тех, что идут подряд. 3 необязательное число (но не меньше трёх). Может быть и 5. Гдавное, чтоб они шли подряд. Пример: 8, 9, 10, 11. |
Blondinka,
вариант для 3 <script> var arr = [9, 9, 9, 111, 5, 2, 5, 3, 4, 4, 5, 7] ; function test(a) { a = a.slice().sort(function(a, b) { return a - b }); return a.some(function(c, b) { var d = a[b + 1], e = a[b + 2]; return c == d - 1 && c == e - 2 && (a = [c, d, e]) }) && a }; document.write(JSON.stringify(test(arr))) </script> |
Цитата:
|
рони,
спасибо. Работает. |
Blondinka,
почему дубликаты есть? id уникально |
рони,
потому что я хотела усложнить себе задачу и написать хоть что-нибудь сама (переделать программу с "поиска дубликатов" на "поиск последовательностей"). Я знаю, что id уникально. В основном коде, оно добавляется только 1 раз. |
Blondinka,
функция для последовательности любой длины больше 2, вернёт найденную первую последовательность или false. <script> var a = [20,21,22,1,2,3,4,5,8] ; function test(a) { a = a.slice().sort(function(a, b) { return a - b }); return a.some(function(d, b) { var c = a.slice(b); c.some(function(a, b) { return a != c[b + 1] - 1 && (c = c.slice(0, b + 1)) }); return 2 < c.length && (a = c) }) && a }; document.write(JSON.stringify(test(a))) </script> |
рони, спасибо.
|
Часовой пояс GMT +3, время: 00:21. |