У меня есть массив [1,1,1,1,2,3,4,5,5,6,7,8,8,8]

Как я могу получить массив различных дубликатов [1,5,8] - каждый дубликат в результате только один раз, независимо от того, сколько раз он появляется в исходном массиве

Мой код:

var types = availControls.map(item => item.type);
var sorted_types = types.slice().sort();

availControlTypes = [];
for (var i = 0; i < sorted_types.length - 1, i++) {
   if (sorted_types[i + 1] == sorted_types[i])
   availControlTypes.push(sorted_types[i]);
}

Это дает мне дубликаты, но не уникальные.

2
full-stack 28 Окт 2019 в 23:43

4 ответа

Лучший ответ

Это сделает это

var input = [1, 1, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 8];

let filterDuplicates = arr => [...new Set(arr.filter((item, index) => arr.indexOf(item) != index))]


console.log(filterDuplicates(input)) 
1
Mike Ezzati 28 Окт 2019 в 20:59

Вам нужен цикл for с объектом, который будет содержать число раз, которое число появилось в массиве. Когда счет уже равен 1, мы можем добавить элемент к результату. Мы должны продолжать увеличивать счетчик, чтобы не добавлять больше одного дубликата с тем же номером (хотя мы можем остановиться на 2).

function fn(arr) {
  var counts = {};
  var result = [];
  var n;
  
  for(var i = 0; i < arr.length; i++) {
    n = arr[i]; // get the current number
    
    if(counts[n] === 1) result.push(n); // if counts is exactly 1, we should add the number to results
    
    counts[n] = (counts[n] || 0) +1; // increment the counter
  }
  
  return result;
}

var arr = [1, 1, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 8];

var result = fn(arr);

console.log(result)
1
Ori Drori 28 Окт 2019 в 20:51

ES6 1 вкладыш. Это очень похоже на то, как мы находим уникальные значения, за исключением того, что вместо фильтрации для 1-х вхождений мы фильтруем для 2-х вхождений.

let nthOccurrences = (a, n = 1) => a.filter((v, i) => a.filter((vv, ii) => vv === v && ii <= i).length === n);

let x = [1, 1, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 8];

let uniques = nthOccurrences(x, 1);
let uniqueDuplicates = nthOccurrences(x, 2);
let uniqueTriplets = nthOccurrences(x, 3); // unique values with 3 or more occurrences

console.log(JSON.stringify(uniques));
console.log(JSON.stringify(uniqueDuplicates));
console.log(JSON.stringify(uniqueTriplets));
0
junvar 28 Окт 2019 в 21:01
const dupes = arr =>
  Array.from(
    arr.reduce((acc, item) => {
      acc.set(item, (acc.get(item) || 0) + 1);
      return acc;
    }, new Map())
  )
    .filter(x => x[1] > 1)
    .map(x => x[0]);

const arr = [1, 1, 1, 1, 2, 3, 4, 5, 5, 6, 7, 8, 8, 8];

console.log(dupes(arr));

// [ 1, 5, 8 ]
0
Hero Qu 28 Окт 2019 в 21:00
58598125