08. februar 2009 - 19:51Der er
10 kommentarer og 1 løsning
Slette fælles værdier i to arrays
Jeg har to arrays og vil gerne sammenligne dem og slette de værdier, de har til fælles. De kunne fx se således ud (de vil nok være lidt længere rigtigt): navne1 = ["Ursula", "Benny", "Svend"]; navne2 = ["Benny, "Tove"]; Da skulle de gerne komme til at se sådan ud: navne1 = ["Ursula", "Svend"]; navne2 = ["Tove"];
Nej, der findes ikke metoder til den slags i JavaScript, så du kommer deværre ikke udenom løkkerne - og nestede løkker er jo aldrig lykken :o| Ellers skal du måske overveje en anden struktur(?)
Jeg opgav i sin tid skriveriet i artikel interface'et i det gamle Eksperten design - det var mildt sagt elendigt at arbejde i. Derfor påbegyndte jeg www.dengodekode.dk - men arbejde har bremset projektet. Jeg har dog en (re)lacering i kalenderen i løbet af foråret =)
Nu er der jo ganske vist en indexOf metode på Array objektet fra JS 1.6, men den version er kun understøttet fra Firefox 3.0.
I stedet har jeg skrevet en lille extension af Array objektets prototype, som bliver kørt i browsere, der ikke understøtter JS 1.6. Faktisk virker dette ovenikøbet også lidt hurtigere i disse browsere, end det jeg viste før =)
/* From JavaScript 1.6 (Firefox 3.0) the prototype of the Array object supports the method 'indexOf'. If not supported: Extend the Array prototype. */ if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(o,nI) { if (nI==null) nI = 0; else if (nI<0) nI = Math.max(0, this.length+nI); for (var i=nI,j=this.length; i<j; i++) if (this[i]===o) return i; return -1; }; }
function arrRemoveDuplicates(aA, aB) { for (var i=aA.length-1; i>=0; i--) { nInx = aB.indexOf(aA[i]); if (nInx>-1) { aA.splice(i, 1); aB.splice(nInx, 1); } } return [aA, aB]; }
var navne1 = ["Ursula", "Benny", "Svend"]; var navne2 = ["Benny", "Tove"];
Hvis du yderligere extend'er Array med forEach (også fra JS 1.6), kan du skrive:
if (!Array.prototype.forEach) { Array.prototype.forEach = function(f /*, o*/) { if (typeof f!="function") throw new Error("Array.forEach :: Argument is of wrong type."); for (var i=0,j=this.length; i<j; i++) { if (i in this) f.call(arguments[1], this[i], i, this); } }; }
var navne1 = ["Ursula", "Benny", "Svend"]; var navne2 = ["Benny", "Tove"];
function foo(sVal, nInx, aArr) { var nFound = this.indexOf(sVal); if (nFound>-1) { aArr.splice(nInx, 1); this.splice(nFound, 1); } }
forEach tager to argumenter: 1) En funktion, som køres for hvert element i array'et. Til denne funktion medsendes tre argumenter: Array-elementet, index og array'et selv.
2) Et objekt, funktionen skal scopes til. Dvs, at 'this' inde i funktionen vil pege på dette objekt - og ikke som forventet på window objektet.
Tak. Jeg kan faktisk godt bruge både forEach og indexOf da det skal foregå server-side, og den server jeg bruger (Jaxer) bruger Mozilla Firefox 3's js engine.
Jaxer udfører faktisk de samme handlinger, men da det foregår et niveau dybere, går det væsentligt hurtigere ;o)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.