Ik heb bijvoorbeeld een array als deze;
var arr = [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7, 8, 9, 10, 10]
Mijn doel is om herhalende elementen uit de array te verwijderen en de uiteindelijke array op deze manier te krijgen;
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Hoe kan dit worden bereikt in JavaScript?
OPMERKING: array is niet gesorteerd, waarden kunnen in willekeurige volgorde staan.
Antwoord 1, autoriteit 100%
Het is gemakkelijker met Array.filter
:
var unique = arr.filter(function(elem, index, self) {
return index === self.indexOf(elem);
})
Antwoord 2, autoriteit 9%
Omdat elementen nog geordend zijn, hoef je geen kaart te bouwen, er is een snelle oplossing:
var newarr = [arr[0]];
for (var i=1; i<arr.length; i++) {
if (arr[i]!=arr[i-1]) newarr.push(arr[i]);
}
Als je array niet was gesorteerd, zou je een kaart gebruiken:
var newarr = (function(arr){
var m = {}, newarr = []
for (var i=0; i<arr.length; i++) {
var v = arr[i];
if (!m[v]) {
newarr.push(v);
m[v]=true;
}
}
return newarr;
})(arr);
Merk op dat dit verreweg veel sneller is dan het geaccepteerde antwoord.
Antwoord 3, autoriteit 5%
var arr = [1,2,2,3,4,5,5,5,6,7,7,8,9,10,10];
function squash(arr){
var tmp = [];
for(var i = 0; i < arr.length; i++){
if(tmp.indexOf(arr[i]) == -1){
tmp.push(arr[i]);
}
}
return tmp;
}
console.log(squash(arr));
Werkvoorbeeldhttp://jsfiddle.net/7Utn7/
Compatibiliteit voor indexOf in oude browsers
Antwoord 4, autoriteit 2%
je kunt het zo proberen met jQuery
var arr = [1,2,2,3,4,5,5,5,6,7,7,8,9,10,10];
var uniqueVals = [];
$.each(arr, function(i, el){
if($.inArray(el, uniqueVals) === -1) uniqueVals.push(el);
});
Antwoord 5, autoriteit 2%
Probeer te volgen vanuit Duplicaten verwijderen uit een array (eenvoudig):
Array.prototype.removeDuplicates = function (){
var temp=new Array();
this.sort();
for(i=0;i<this.length;i++){
if(this[i]==this[i+1]) {continue}
temp[temp.length]=this[i];
}
return temp;
}
Bewerken:
Deze code hoeft niet gesorteerd te worden:
Array.prototype.removeDuplicates = function (){
var temp=new Array();
label:for(i=0;i<this.length;i++){
for(var j=0; j<temp.length;j++ ){//check duplicates
if(temp[j]==this[i])//skip if already present
continue label;
}
temp[temp.length] = this[i];
}
return temp;
}
(Maar geen geteste code!)