[js] prototype voor Array komt in de lijst van array keys

Pagina: 1
Acties:

  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
Omdat volgens mijn research javascript geen in_array functie heeft voor arrays, heb ik zelf maar eentje gemaakt, tevens ook een in_array_keys functie:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// add a find function to arrays similar to php's in_array function
Array.prototype.in_array = function (needle)
{
    var i;
    
    for (i = 0; i < this.length; i++)
    {
        if (this[i] == needle)
        {
            return true;
        }
    }
    
    return false;
}

// same as in_array, but works on keys instead
Array.prototype.in_array_keys = function (key)
{
    var i;
    
    for (i in this)
    {
        if (i == key)
        {
            return true;
        }
    }
    
    return false;
}


Tot zover gaat alles goed, maar nu, ik heb een array 'buttons', als volgt gedefinieerd:

JavaScript:
1
2
var buttons     = new Array();
buttons['bold'] = 'b';


Als ik nu door de elementen van deze array ga lopen, zie ik tot mijn verbazing dat er ook een key in_array is aangemaakt:

JavaScript:
1
2
3
4
for (i in buttons)
{
    alert(i);
}


Geeft mij twee alerts, eentje met de voorspelbare 'bold', en eentje, met in_array als tekst. Wat ik vooral vreemd vind is dat wel in_array als key wordt gedefinieerd, maar niet in_array_keys, terwijl beide werken. Het allerbelangrijkste is echter hoe ik dit gedrag voorkom.

Ik ontken het bestaan van IE.


Verwijderd

het type of de constructor van i checken

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

hasOwnProperty()

Overigens heeft javascript 1.6 een indexOf die op arrays werkt en die eenvoudig te porten is naar antieke browsers:
JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
if (!Array.prototype.indexOf)
{
    Array.prototype.indexOf = function(searchElement, fromIndex)
    {
        var l = this.length, i = 0;
        if (fromIndex)
        {
            i = fromIndex;
            if (i < 0)
            {
                i += l;
                if (i < 0) i = 0;
            }
        }

        while (i < l)
        {
            if (this[i] === searchElement) return i;
            i++;
        }

        return -1;
    }
}


Overigens om een key te checken zou ik gewoon dit doen:
JavaScript:
1
if (array.hasOwnProperty(key)) { }


note dat hasOwnProperty ook niet ondersteund wordt door antieke browsers, maar ook dat is te backporten ;)

[ Voor 10% gewijzigd door crisp op 13-08-2006 17:52 ]

Intentionally left blank


  • cyberstalker
  • Registratie: September 2005
  • Niet online

cyberstalker

Eersteklas beunhaas

Topicstarter
@ crisp: bedankt, maar ik had begrepen dat indexOf de index teruggeeft waar het element is gevonden. Dat is niet precies wat in_array doet natuurlijk. in_array geeft gewoon false terug wanneer een element niet is gevonden, terwijl je bij indexOf natuurlijk een probleem hebt als een element als index 0 heeft.

Als het niet anders kan zal ik wel die functies gebruiken, ik zou echter toch graag willen weten waar dit probleem vandaan komt.

Ik ontken het bestaan van IE.


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

cyberstalker schreef op zondag 13 augustus 2006 @ 18:07:
@ crisp: bedankt, maar ik had begrepen dat indexOf de index teruggeeft waar het element is gevonden. Dat is niet precies wat in_array doet natuurlijk. in_array geeft gewoon false terug wanneer een element niet is gevonden, terwijl je bij indexOf natuurlijk een probleem hebt als een element als index 0 heeft.
nee, dat is geen probleem want indexOf geeft -1 terug als de waarde niet gevonden kan worden ;)
Als het niet anders kan zal ik wel die functies gebruiken, ik zou echter toch graag willen weten waar dit probleem vandaan komt.
Het is geen probleem maar gewoon by design; for-in constructs geven ook prototyped methods terug

Intentionally left blank