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.
3 Réponses :
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);
Jamais pensé à cette solution lors d'un test JavaScript contraint :)
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);Cette solution semble être plus facile à déduire et à comprendre.
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]));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?