Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130

    array associativi in javascript? da modalità arraya modalità oggetto

    discutiamo sto risultato asieme un attimo??

    codice:
    	var a = [];
    	a[0] = "a";
    	a[1] = "b";
    /* [!!!] la prossima riga è molto importante. Infatti, per il modo in cui viene numerata (uso della stringa "public" invece che un numero), essa finisce per essere una proprietà pubblica dell'array inteso come oggetto e non conta come elemento dell'array inteso in senso classico! 
    */
    	a["public"] = "variabile pubblica dell'oggetto Array";
    	alert("a.length: " + a.length) // stampa 2 - ma gli elementi registrati sono 3!!
    	// stampo la proprietà dell'oggetto che "non appartiene" all'array!! 
    	alert(a.public) // esso è in effetti presente
    Come inquadrate il fenomeno?

    1 - sembra che usando una stringa al posto di un numero come indice dell'array si passi dalla modalità "array" a quella "oggetto" (di cui in egffetti gli array sono un sottoinsieme in javascript).

    2 - quindi gli array associativi non sono supportati dfal linguaggio?

  2. #2
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    al momento mi viene in mente solo un workaround semplice

    ri-edit:
    codice:
    var a = [];
    a[0] = "a";
    a[1] = "b";
    a["public"] = "variabile pubblica dell'oggetto Array";
    
    Array.prototype.mixedLength = function () {
        var l = 0;
        for (p in this) l++;
        return l - 1;
    }
    
    
    alert(a.length);
    alert(a.mixedLength());
    Sicuramente esisterà una soluzione migliore.
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  3. #3
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    questa dovrebbe essere meglio

    codice:
    Array.prototype.mixedLength = function () {
        var l = 0;
        for (p in this) { if (this.propertyIsEnumerable(p)) l++; }
        return l;
    }
    dal momento che se usi la precedente funzione ed estendi ulteriormente l'array in modo prototipale, il risultato sarebbe incoerente.

    Infatti (http://developer.mozilla.org/en/docs...tyIsEnumerable)

    Every object has a propertyIsEnumerable method. This method can determine whether the specified property in an object can be enumerated by a for...in loop, with the exception of properties inherited through the prototype chain. If the object does not have the specified property, this method returns false.
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  4. #4
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    no grazie ma a me non interessa contare come elementi dell'array anche quelli che usano una chiave di tipo "stringa"!

    Quello a cui sono ineterssato è la teoria sottostante: perche il linguaggio si comporta in questo modo. Capisci? cioè il fatto che l'oggetto si comporti in mnodalità array solo in certe occasioni mi intriga ;-)

  5. #5
    Frontend samurai L'avatar di fcaldera
    Registrato dal
    Feb 2003
    Messaggi
    12,924
    l'array in js si comporta come vorresti solo quando usi una coppia chiave numerica / valore
    la sua proprietà length è limitata a questo tipo di elementi

    oltre a permetterti una notazione del tipo
    a['chiave'] = 'valore'

    ti permette anche l'uso della notazione ad oggetti
    a.chiave = 'valore';

    non a caso un typeof di un array dà 'Object'
    Vuoi aiutare la riforestazione responsabile?

    Iscriviti a Ecologi e inizia a rimuovere la tua impronta ecologica (30 alberi extra usando il referral)

  6. #6
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    esatto! che è quello che avevo rilevato io:

    chiave numerica/valore = puoi usare gli strumenti da Array

    è fuori JavaScript no? ;-)

    e pensare che una volta mi faceva schifo!

  7. #7
    ci sono mille ragioni per sconsigliare l'uso di chiavi associative in array ... se ti servono chiavi associative hai l'object.

    L'array nasce per le chiavi numeriche, ergo grazie a Dio se imposti una proprietà la length resta invariata, ergo l'Array JS si comporta come previsto sempre!

    La notazione
    a["pippo"]
    o
    a.pippo
    è esattamente la stessa cosa.

    Come lo è questa
    a["0"]
    o
    a[0]
    proprio perchè a prescindere da come assegni la chiave il motore verifica sia un integer like, e lo casta, se necessario.

    Nel caso dei numeri non puoi usare a.0, perchè il parser darebbe errore, lo stesso errore che darebbe usando a."pippo", ergo rimaniamo sempre nella voluta logica.

    Ogni linguaggio ha un suo Array, ed il comportamento è sempre lo stesso.
    new Array in JS è instanceof Object prima, ed Array poi ... ergo quello che puoi fare con l'object puoi farlo anche con l'Array, ma essendo quest'ultimo un extend di Object, gestisce indici numerici tramite overload.

    Immagina che internamente c'è un get / set chiave / valore ... se chiave è int o parseInt(chiave) == chiave allora sfrutti length, altrimenti sfrutti la super classe dinamica Object.

    Questo lo implementi anche con altri linguaggi, io ho un Array identico in PHP e C#, ho creato queste classi estendendo l'Object (in PHP e C#) ed ottengo lo stesso identico risultato.

    Nel push, forEach, indexOf, slice, quello che vuoi ... lavori con i numeri ... altrimenti lavora come Object ... ma per performances e overhead (Array è più pesante di Object), è sempre sconsigliabile sfruttare l'Array come se fosse un Object (anche per ambiguità aggiunta durante l'utilizzo dell'istanza)

    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    bene bene vfedo che confermi la mia posizione.

    grazie

  9. #9
    Originariamente inviato da nourdine
    bene bene vfedo che confermi la mia posizione.
    affatto, gli Array associativi (sempre che questa definizione abbia un senso) sono supportati e come
    codice:
    var	a = [1,2,3];
    a.pippo = "pluto";
    for(var key in a)
        alert(key);
    risultato?
    0
    1
    2
    pippo

    array associativo ... la length con gli array associativi non c'entra un granchè ... il count di PHP è questo (e PHP è stracolmo di ambiguità):
    codice:
    var	a = [1,2,3];
    a.pippo = "pluto";
    
    
    function count(Object){
    	var	i = 0,
    		key;
    	for(key in Object)
    		if(Object.hasOwnProperty(key))
    			++i;
    	return	i;
    };
    
    alert(count(a));	// 4
    ma essendo Array un Array, e non un HashTable, e sapendo che gli array lavorano su indici numerici, qualora la length restituisse 4 contando erroneamente anche l'associazione, dato che è un Array, come potresti fare un loop ?
    codice:
    var	a = [1,2,3];
    a.pippo = "pluto";
    
    for(var i = 0; i < a.length; i++)
    	alert(a[i]);
    Ovviamente un Array deve poter essere looppato in questo modo ... perchè il foreach o for che sia, non garantisce alcun ordine, seppur sia spesso quello sperato.

    Fosse come dici tu, cosa faresti per un loop di Array, questo?
    codice:
    for(var i = 0; a[i] !== undefined; i++)
    	alert(a[i]);
    e come la mettiamo con Array che hanno lenght fissata ma non necessariamente tutti i valori settati?
    codice:
    var a = new Array(10);
    a[2] = 2;
    Sunto: JavaScript supporta gli Array, chi pensa che gli Array possano essere usati come associativi (che "non esistono", sono Hash Tables) e debbano contare tutto, non creerà molto codice con gli Array veri, tanto vale che utilizza un instanza di Object
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  10. #10
    Utente di HTML.it L'avatar di nourdine
    Registrato dal
    Nov 2005
    Messaggi
    1,130
    andr3azzzz adesso rispondo eh? non mi sono mica spaventato ... ho capito quasi il 90% di quello che hai scritto è ho delle osservazioni!

    E' che stamattina sono sotto con delle newsletter di m...a da ottimizzare per outlook 2007 il quale, a mia insaputa, ha avuto la bella idea di segare il minimamanete decente supporto ai css della versione 2003. Quei ragazzi mi stupiscono sempre di più.

    tra l'altro scopro con stupore che siamo entrambi londinesi ... ;-)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.