La conversione di Array di Stringa di un Oggetto con Javascript o jQuery

Sto elencando ogni elemento del DOM del id sulla pagina con:

 var listy = $("*[id]").map(function(){
    return this.id;
 }).get().join(',');

Così, un esempio di output di listy sarebbe:

"home,links,stuff,things"

Ora voglio convertire il listy Array per un Object, come:

function toObject(arr) {
    var rv = {};
    for (var i = 0; i < arr.length; ++i)
        if (arr[i] !== undefined) rv[i] = arr[i];
    return rv;
}

Ma che wil mettere tutto in un Object come:

0: "h", 1: "o", 2: "m", etc...

Quello che ho ovviamente è:

0: "home", 1: "links, 2: "stuff", etc..

Dove sto andando male, ho avuto la toObject() da: Convertire un Array di Oggetti

Che mi porta ad una simile, ma diversa domanda:

Indicizzazione elementi di pagina in oggetto JSON? O selettore di jQuery ogni volta?

Si può dividere in due domande? StackOverflow non funziona anche se una ‘domanda’ è in realtà multiple, estranei, domande.

OriginaleL’autore TrySpace | 2012-06-20

5 Replies
  1. 3

    Questo è probabilmente il più breve di codice che è possibile scrivere per ottenere il vostro oggetto:

    //your existing code (a tiny bit changed)
    var idArray = $("*[id]").map(function() {
        return this.id;
    }).get();
    
    //this one liner does the trick
    var obj = $.extend({}, idArray);

    Un approccio migliore per il vostro problema – array associativo

    Ma come ho letto nei vostri commenti in altre risposte di questo oggetto potrebbe non essere la cosa migliore nel tuo caso. Quello che vuoi è quello di verificare se un particolare ID esiste già. Questo oggetto

    {
        0: "ID1",
        1: "otherID",
        ...
    }

    non saranno di molto aiuto. Un oggetto migliore sarebbe un array associativo oggetto:

    {
        ID1: true,
        otherID: true,
        ...
    }

    perché rendono semplice per determinare particolare ID semplicemente verifica utilizzando questa condizione in if istruzione:

    if (existingIDs[searchedID]) ...

    Tutti gli Id che non esistono verrebbe a mancare questa condizione e di tutto ciò che esiste tornerà true. Ma per convertire l’array di Id di questo oggetto si consiglia di utilizzare questo codice:

    //your existing code (a tiny bit changed)
    var idArray = $("*[id]").map(function() {
        return this.id;
    }).get();
    
    //convert to associative "array"
    var existingIDs = {};
    $.each(idArray, function() { existingIDs[this] = true; });

    o dato i risultati necessari è possibile ottimizzare questo un po ‘ di più:

    var existingIDs = {};
    $("*[id]").each(function() { existingIDs[this.id] = true; });

    Questo accelererà il vostro ID esistente la ricerca per il max. Verifica ID unicità probabilmente non ha bisogno gerarchica struttura dell’oggetto come è possibile ottenere le informazioni su ID esistenza in O(1). Superiore array associativo oggetto vi darà questa super veloce di possibilità. E quando si crea un nuovo oggetto con un nuovo ID, si può facilmente aggiungere al già esistente array associativo oggetto semplicemente facendo questo:

    existingIDs[newID] = true;

    E basta. Il nuovo ID viene memorizzata insieme con gli altri nello stesso array associativo oggetto.

    Attenzione: posso vedere il tuo codice è implicita globale (listy variabile). Attenzione e di evitare, se possibile.

    Test delle prestazioni

    Come @Blazemonger suggerisce questo non trattengono l’acqua direi che questa affermazione può essere vera. Tutto si riduce a:

    • il numero di elementi con Id hai
    • numero di ricerche che ti piacerebbe fare,

    Se il primo è normalmente bassa come quella delle normali pagine HTML in cui le classi CSS sono utilizzati più frequentemente rispetto IDs e se il secondo è abbastanza grande quindi questa performance test dimostra che l’array associativo può essere un po ‘ più veloce rispetto all’utilizzo di jQuery da solo. HTML Utilizzati in questo test è una copia di Stackoverflow elenco delle domande sul sito mobile (quindi ho avuto meno lavoro eliminando script dall’origine). Ho volutamente preso un esempio di un mondo reale contenuto del sito che preparato caso di prova che può essere volutamente realizzati a favore di una o l’altra soluzione.

    Se siete alla ricerca su una scala molto più piccola, che io utilizzo dritto in avanti jQuery sarebbe più veloce perché non richiede di start-up array associativo di preparazione e viene fuori la ricerca di subito.

    OriginaleL’autore Robert Koritnik

  2. 5

    Tuo listy è una stringa, non un array. Modifica il tuo primo blocco di codice in questo modo:

     listy = $("*[id]").map(function(){
        return this.id;
     }).get();

    http://jsfiddle.net/P7YvU/

    Come per la creazione di un oggetto di indicizzazione l’intero documento: per quale scopo? C’è poco vantaggio a farlo da soli quando si può solo analizzare il DOM direttamente, soprattutto dal momento che jQuery è così facile. Invece di chiamare DOMJSONTHING.body.div.h1 per ottenere il valore di “casa”, si può già chiamare $('document > body > div > h1').attr('id') e ottenere lo stesso risultato.

    Voglio solo avere tutti gli elementi in un oggetto, di un monitor che oggetto con, credo, che .guarda, e quando l’oggetto modifiche, modificare il DOM…
    E, non voglio chiamare il selettore di jQuery ogni volta, per risparmiare risorse. Perché voglio cache struttura del DOM, quindi, sono in grado di leggere/scrivere su di esso.
    La quantità di overhead consumato da jQuery per la ricerca di un DOM, probabilmente è inferiore alla quantità di overhead si consumerà edificio oggetto, in primo luogo. I computer sono veloci questi giorni. Oggetto presuppone, inoltre, che ogni singolo elemento avrà un ID univoco, che potrebbe non essere il caso. Questo è un caso di prematura di ottimizzazione, cercando di salvare i cicli prima ancora di avere ragione di pensare che è necessario.
    Cosa è.. voglio fare di questo Oggetto per verificare se un ID già esistente e poi rinominarlo, prima di creare un elemento…
    Quindi, su richiesta, piuttosto che farlo prima del tempo. Di nuovo: non c’è nessun motivo per non.

    OriginaleL’autore Blazemonger

  3. 2
    var str = 'home,links,stuff,things',
        obj = {};
    
    $.each(str.split(','), function(index, val) {
        obj[index] = val;
    });

    DEMO

    Cosa succede se voglio cambiare l’0, 1, 2 indice dell’Oggetto corrispondono all’elemento.tagName, quindi, l’assegnazione di ‘questo’ per l’indice di oggetto. Anche allora, come evitare che la creazione di Oggetti duplicati indici, ma il raggruppamento di ogni elemento in un nodo tag?
    oggetto non consente la duplicazione delle chiavi. Se si tenta di fare l’ultimo valore rimarrà. Supponiamo var x = {a: 'abc'} e quindi se si tenta x.a = 'def', allora il risultato sarà x= {a: 'def'};

    OriginaleL’autore thecodeparadox

  4. 1

    Controllare questo fuori http://jsfiddle.net/ryan_s/XRV2m/

    Sarà

    1. Creare una cache per memorizzare gli id degli elementi esistenti in modo non si ottiene una riduzione delle prestazioni ogni volta che si desidera creare un nuovo id.
    2. Automatico Generare un id incrementale in base al nome del tag che si passa a
      .
    3. Aggiornare la cache, se davvero la si utilizza l’id.

    Io sono solo la stampa l’id della console per convenienza.

    Solo i miei 2 cents basato su alcuni dei vostri commenti precedenti per altre risposte.

    OriginaleL’autore Ryan

  5. 0

    il mio codice:

    jQuery.ajax({
            type: 'POST',                    
            url:'../pages/HomePage.php',            
            data:{param  : val},
            dataType:'HTML',                
            success: function(data)
            {
                var data = data ;
                obj = {};
    
    
    
                 $.each(data.split(','), function(k, v) {
                     obj[k]= v;
                alert("success"); 
    
             $("#process_des").val(obj[0]);
                 });
    
            }
        }); 

    mia uscita

    Array
    (
        [0] => FILLET SKIN OFF
        [1] => SF
    )

    OriginaleL’autore muthu

Lascia un commento