0
votes

Imprimer les 2 numéros non dupliqués JavaScript

J'ai rencontré ce problème dans un test JavaScript dans lequel j'ai besoin d'imprimer des 2 premiers numéros non dupliqués et voici ma tentative partielle.

var list = [5, 23, 23, 5, 66, 3, 23, 7, 3, 0];


var locObj = {};
var count = 1;

for(var i =0; i< list.length; i++){
  if(!(list[i] in locObj))
  locObj[list[i]] = 1;
  else
    locObj[list[i]] = count++;
}

console.log(locObj);//has an object with value as 1 if its non duplicate and the number of occurrences in the case of duplicate values.


0 commentaires

3 Réponses :


2
votes

J'utiliserais une carte à la place, dont les méthodes d'itération (ici, entrées () code> ) Itérate dans l'ordre d'insertion. Comptez sur une carte, semblable à ce que vous faites, puis obtenez les entrées de la carte, filtrez par ceux-ci avec un nombre de 1, et une tranche pour obtenir les deux premiers:

p>

var list = [5, 23, 23, 5, 66, 3, 23, 7, 3, 0];
const countByNum = new Map();
list.forEach((num) => {
  countByNum.set(num, (countByNum.get(num) || 0) + 1);
});
const firstTwoNonDupes = [...countByNum.entries()]
  .filter(([, count]) => count === 1)
  .slice(0, 2)
  .map(([num]) => num);
console.log(firstTwoNonDupes);


1 commentaires

Jamais pensé à cette solution lors d'un test JavaScript contraint :)



1
votes

Vous pouvez d'abord créer des chiffres cartographiques en tant que clé et répétition en tant que valeur, puis en boucle à nouveau sur matrimonie et sélectionnez les deux premiers chiffres qui ont une valeur comme 1 sur l'objet de mappage

var list = [5, 23, 23, 5, 66, 3, 23, 7, 3, 0];

let mapping = list.reduce((op,inp)=>{
  op[inp] = op[inp] || 0
  op[inp]++
  return op
},{})

let firstTwo = []

list.forEach(v=> {
  if(mapping[v] === 1 && firstTwo.length < 2){
    firstTwo.push(v)
  }
})

console.log(firstTwo);


1 commentaires

Cette solution semble être plus facile à déduire et à comprendre.



1
votes

Vous pouvez prendre une combinaison d'un Carte code> , où la carte stocke uniquement les valeurs observées et un SET CODE> En tant que résultat défini pour la valeur qui sont vues.

p>

function getFirstTwoNonDuplicateValues(array) {
    var map = new Map,
        result = new Set,
        value;
    
    for (value of array) map.set(value, map.has(value)
        ? result.delete(value)
        : result.add(value));
    
    return [...result].slice(0, 2);
}

console.log(getFirstTwoNonDuplicateValues([5, 23, 23, 5, 66, 3, 23, 7, 3, 0]));


1 commentaires

Solution intéressante, je pense qu'il est plus efficace en raison d'une seule boucle et de moins d'opérations par rapport à d'autres solutions?