Найти и показать дублирующее значение

114
8

Любая идея, как это сделать:

var MyArr = [0,1,2,3,"something",44,661,3,1,"something"]
var Results = [1,3,"something"]

Я просто хочу найти дублирующиеся значения в моем массиве.

спросил(а) 2013-09-24T16:40:00+04:00 7 лет, 1 месяц назад
1
Решение
71

Используйте цикл for:

var Results = [];
MyArr.forEach(function(el, idx){
//check if value is duplicated
var duplicated = MyArr.indexOf(el, idx + 1) > 0;
if(duplicated && Results.indexOf(el) < 0) {
//duplicated and not in array
Results.push(el);
}
});

ответил(а) 2013-09-24T16:42:00+04:00 7 лет, 1 месяц назад
57

Решение с O (n) временем и O (n) пространством. Пример:

Results = duplicates(MyArr); 

Использование структуры данных карты. Работает только в том случае, если в MyArr есть строки или цифры;

function duplicates(input) {

var results = [],
_map = {};

for (var i in input) {

if (typeof _map[input[i]] == "undefined") {

_map[input[i]] = 1;
}
else {

_map[input[i]]++;
}
}

for (var argument in _map) {

if (_map[argument] > 1) {

results.push(argument);
}
}

return results;
}

PS: Поскольку _map [input [i]] занимает время O (1), потому что это хеш-таблица, но indexOf() принимает время O (n). PS2: другое решение с более низкой константой:

function duplicates(input) {

var results = [],
_map = {};
WAS = 1,
SKIP = -1;

for (var i in input) {

if (typeof _map[input[i]] == "undefined") {

_map[input[i]] = WAS;
}
else if (_map[input[i]] == WAS) {

_map[input[i]] = SKIP;
results.push(input[i]);
}
}

return results;
}

ответил(а) 2013-09-24T17:09:00+04:00 7 лет, 1 месяц назад
41

Вы можете имитировать подсчитанный набор, используя объект, свойства которого являются элементами набора и значениями которого являются количество вхождений. Таким образом, вы можете преобразовать свой массив в подсчитанный набор и считать элементы с числом в два или более. (Это работает, только если элементы MyArr являются строками или цифрами.)

Поэтому попробуйте следующее:

var counts = {} ;
MyArr.forEach(function(el){
counts[el] = counts[el]==undefined ? 1 : counts[el]+1 ;
});
var Results = Object.keys(counts).filter(function(el){
return counts[el] > 1 ;
}) ;

ответил(а) 2013-09-24T17:33:00+04:00 7 лет, 1 месяц назад
41

Вы можете сохранить каждое значение в новом массиве, и перед добавлением нового элемента в такой массив проверьте, существует ли он, и верните результаты. Пример использования Array.forEach():

var myArr  = [1,2,3,2];
var results = [];

myArr.forEach(function(item) {
if (results.indexOf(item) < 0) {
results.push(item);
}
});

Если вы просто хотите дублировать значения, вы можете использовать очень похожий подход и использовать Array.filter.

Примечание: будьте осторожны, что Array.indexOf() не работает в IE8, например, вы можете использовать метод jQuery.inArray()

ответил(а) 2013-09-24T16:54:00+04:00 7 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема