Как отфильтровать все элементы, которые встречаются один раз, в один список, а все элементы, которые встречаются несколько раз, в другой? - PullRequest
0 голосов
/ 28 мая 2020

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

Мне нужно удалить все повторяющиеся имена и поместить их в отдельный файл

Это пример того, чего я пытаюсь достичь: Итак, у меня есть массив чисел (1,2,2,3,3,4,5), и я хотел бы удалить все дубликаты из массива, чтобы получить (1, 4,5).

Ответы [ 5 ]

1 голос
/ 28 мая 2020

На основе введенных вами входных данных: [1, 2, 2, 3, 3, 4, 5] и того факта, что вы сказали, что вам нужны два выхода: один с уникальными значениями, [1,4,5] и один с дубликатами [2,2,3,3].

Приведенная ниже функция даст вам два массива в качестве выходных данных, один с уникальными значениями, а другой с дубликатами.

const getUniqueAndDuplicates = (arr) =>{

    //use a JavaScript object as a map to count frequency
    const map={};
    for(let i=0;i<arr.length;i++){
        if(map[arr[i]]){map[arr[i]]++;}
        else{map[arr[i]]=1;}
    }

    const uniqueArray=[];
    const duplicateArray=[];



    for(let key in map){
        //get the frequency count
        let freq=map[key];

        if(freq===1){uniqueArray.push(key);}
        else{
            for(let i=0;i<freq;i++){
                duplicateArray.push(key);
            }
        }

    }

    return [uniqueArray,duplicateArray];

}
1 голос
/ 28 мая 2020

Всегда ли массив будет отсортирован?

нет, но это может быть что-то, что нужно учитывать @ Thomas

Хорошо, это позволило бы что-то вроде этого:

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

const array = [1,2,2,3,3,4,5];
const single = [];
const multiple = [];

for (let i = 0, length = array.length; i < length; ++i) {
  let value = array[i];
  const isDupe = i > 0 && value === array[i - 1]
    || i + 1 < length && value === array[i + 1];

  if (isDupe) {
    multiple.push(value);
  } else {
    single.push(value);
  }
}

console.log("singles", single);
console.log("multiple", multiple);

Если данные не гарантированно отсортированы, нам нужно сначала выполнить подсчет, чтобы проверить, какие элементы уникальны в этом массиве, а какие нет. А на втором проходе мы можем добавить их в массивы результатов.

const array = [3, 2, 4, 2, 5, 1, 3];
const single = [];
const multiple = [];
const count = {};

for (let i = 0; i<array.length; ++i) {
  let value = array[i];
  count[value] = (count[value] || 0) + 1;
}

for (let i = 0; i<array.length; ++i) {
  let value = array[i];
  if (count[value] > 1) {
    multiple.push(value);
  } else {
    single.push(value);
  }
}

console.log("singles", single);
console.log("multiple", multiple);
1 голос
/ 28 мая 2020

Без использования каких-либо внешних библиотек - я уверен, что есть более лаконичные способы сделать это, но это должно работать:

var numbers = [1, 2, 2, 3, 3, 4, 5];

function removeDuplicates(array) {

  var existingValues = [];   // Holds all values that exist at least once
  var duplicates = [];       // Holds all values that are duplicates

  array.forEach(function(num) {
    if (existingValues.indexOf(num) === -1) {
      existingValues.push(num);
    } else {
      duplicates.push(num);
    }
  });

  // Filter out the values from existingValues that are in the duplicates array
  return existingValues.filter(function(i) {
    return duplicates.indexOf(i) === -1;
  });

}

console.log(removeDuplicates(numbers)); // [1,4,5]
1 голос
/ 28 мая 2020

Для l oop массив и поместите каждое значение в карту ha sh, которая отслеживает, сколько раз это число было записано. Затем l oop через вашу карту ha sh и создайте новый массив только со значениями, имеющими запись 1.

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

function removeDuplicates(arr) {

    var hashMap = {};
    for(let i of arr) {
        if(hashMap[i]){
            hashMap[i] += 1
        } else {
            hashMap[i] = 1
        }
    }

    var newArray = [];
    for(let [key, value] of Object.entries(hashMap)){
        if(value === 1) {
            newArray.push(parseInt(key));
        } else {
            // If you want to do something with values recorded more
            // than once, you can do that here.
        }
    }

    return newArray;

}
0 голосов
/ 28 мая 2020

Есть много способов удалить дублирование в массиве. Вот несколько примеров.

Использование Set ()

Объекты Set представляют собой наборы значений. Вы можете перебирать элементы набора в порядке вставки. Значение в наборе может встречаться только один раз

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

const duplicated = [1,2,3,2,3,4,3,5];
const uniqSet = new Set(duplicated);
console.log([...uniqSet]) // Should be [1, 2, 3, 4, 5]

Использование метода loda sh uniq ()

Документ: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

const _ = require('lodash');

const duplicated = [1,2,3,2,3,4,3,5];
const uniq = _.uniq(duplicated);
console.log(uniq) // Should be [1, 2, 3, 4, 5]

Царапина

const duplicated = [1,2,3,2,3,4,3,5];
const uniq = [];

for (const e of duplicated) {
  if (!uniq.includes(e)) {
    uniq.push(e)
  }
}

console.log(uniq) // Should be [1,2,3,4,5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...