Zoeken in een array

Status
Niet open voor verdere reacties.

Grand Cru

Gebruiker
Lid geworden
15 nov 2006
Berichten
13
Onderstaand script geeft de keys weer indien de volledige zoekterm in een array voorkomt:
Code:
<html>
<head>
<title>array.prototype.find</title>
<script> 
Array.prototype.find = function(searchStr) {
  var returnArray = false;
  for (i=0; i<this.length; i++) {
    if (typeof(searchStr) == 'function') {
      if (searchStr.test(this[i])) {
        if (!returnArray) { returnArray = [] }
        returnArray.push(i);
      }
    } else {
      if (this[i]===searchStr) {
        if (!returnArray) { returnArray = [] }
        returnArray.push(i);
      }
    }
  }
  return returnArray;
}
</script>
</head>
<body>
<script> 
var test=['nul','een', 'twee', 'drie', 'vier','een']
resultaat1=test.find('een'); // OK
resultaat2=test.find(/^ie/i); // WERKT NIET   
alert(resultaat1);
</script>
</body>
</html>
Nu zou ik dit graag uitbreiden zodat ook de keys weergegeven worden indien de zoekterm slechts een deel van de overeenkomst uitmaakt (bijvoorbeeld: de zoekterm 'ie' retourneert de keys 3,4).
Heeft iemand weet van het bestaan van zo'n script, of heeft iemand tips hoe dit script zelf te maken? Ik heb al allerlei geprobeerd maar dit heeft totnutoe niet het gewenste resultaat opgeleverd.
Bij voorbaat dank voor jullie hulp.
 
in je loop:
[JS] // {

for(var j=0;j<currentItem.length;j++)
{
if(currentItem.substr(i,2) == zoekDing)
{
return true;
}
return false
}

// }[/JS]
dit is een voorbeeldje van wat je moet doen. Het idee hierachter is dat je door elk array-item loopt, en daar nog eens doorheen. Een dubbele loop dus. Nadeel: erg veel loops, dus kost veel tijd. Als je dit met een te grote array doet, krijg je problemen met je browser.

Met de substr() kan je in een loop dus steeds de characters opvragen. Noot dat je wel te veel loopt, omdat het aantal letters ook oneven kan zijn. Moet je maar even proberen. Noot dat deze anders is dan substring()


:thumb:

Ohja, nog een truckje: als je in een loop dit doet:
[JS]for(var i=0;i<foo.length;i++)
{
//...
}[/JS]zal ie elke keer de foo.length te berekenen. Daarom doe ik altijd dit:
[JS]var i, len;

len = foo.length;
for(i=0;i<len;i++)
{
//...
}
[/JS]
of, korter:
[JS]var i, len = foo.length;
for(i=0;i<len;i++)
{
//...
}[/JS]
 
Laatst bewerkt:
Kan je geen gebruik maken van de indexOf methode?

Dus in plaats van [js]if (this===searchStr)[/js][js]if (this.indexOf(searchStr) != -1)[/js]
 
Heel erg bedankt voor jullie snelle en zeer gewaardeerde reacties.
Direct de tip van Supersnail getest - omdat die de kleinste aanpassing van het script vergde - met onmiddellijk het gewenste resultaat.
De andere tips test ik straks nog eens uit om te kunnen vergelijken.
In ieder geval: VAN HARTE DANK AAN JULLIE ALLEMAAL!
 
Laatst bewerkt:
@Supersnail : goed punt. Dat kan inderdaad, en is, denk ik, wel een stuk efficienter. Maar in principe doet het natuurlijk hetzelfde als de loop.

@ErikBooy007: yea, daar kwam ik ook achter, dus heb het ge-edit. Maar op maar 1 van de 2 plekken :p




:thumb:
 
Alle voorstellen zijn getest en evenwaardig bevonden: bedankt voor jullie deskundige hulp!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan