2012-05-02 30 views
51

non riesco a trovare l'equivalente JavaScript del php array_keys()/array_values()chiavi di hash/valori come array di

Per le persone non hanno familiarità con php dato il seguente js hash:

var myHash = {"apples": 3, "oranges": 4, "bananas": 42} 

Come posso ottenere un array di chiavi , vale a dire

["apples", "oranges", "bananas"] 

Stessa domanda con i valori, vale a dire

[3, 4, 42] 

jQuery può essere utilizzato.

+0

possibile duplicato di [Ottieni la matrice delle chiavi dell'oggetto] (http://stackoverflow.com/questions/8763125/get-array- of-objects-keys) e [Come ottenere tutti i valori delle proprietà di un oggetto Javascript (senza conoscere le chiavi)?] (http://stackoverflow.com/questions/7306669/how-to-get-all-properties-values -di-a-javascript-oggetto-senza-the-chiave conoscente). –

risposta

44
var a = {"apples": 3, "oranges": 4, "bananas": 42};  

var array_keys = new Array(); 
var array_values = new Array(); 

for (var key in a) { 
    array_keys.push(key); 
    array_values.push(a[key]); 
} 

alert(array_keys); 
alert(array_values); 
+8

+1, tuttavia l'interno del ciclo 'for' dovrebbe essere racchiuso in una verifica che la chiave corrente sia effettivamente la proprietà dell'oggetto in questione (al contrario di una proprietà ereditata). Altrimenti, in IE, è possibile ottenere alcune chiavi inaspettate: 'if (Object.prototype.hasOwnProperty.call (a, key)) {array_keys.push (chiave); array_values.push (a [chiave]);}' – JAAulde

+0

@ JAAulde: Non conosco alcun problema di IE. quando si enumera un oggetto. Potresti fornire un'ulteriore descrizione di questo problema? Quali chiavi saranno trovate? –

+0

@amnotiam Crockford lo consiglia nelle sue istruzioni LINT all'indirizzo http://www.JSLint.com/lint.html#forin e fa riferimento a un articolo che ha scritto sull'argomento all'indirizzo http://yuiblog.com/blog/2006/09/ 26/for-in-intrigue/ – JAAulde

59

In ES5 supportato (o spessorato) browser ...

var keys = Object.keys(myHash); 

var values = keys.map(function(v) { return myHash[v]; }); 

Spessori da MDN ...

+0

+1, potresti approfondire su quali sono questi browser? – greg0ire

+0

@ greg0ire: i browser supportati sono in genere tutti i browser moderni. Generalmente la maggior parte di Chrome e Safari in uso, Firefox 4+, Opera 10+ * (forse prima?) * E IE9. Puoi tranquillamente utilizzare entrambi questi metodi per supportare i browser legacy. –

+0

@ greg0ire: ho aggiunto collegamenti agli shim forniti da MDN. –

1

Non so se aiuta, ma il "foreach" passa attraverso tutte le chiavi: for (var chiave in obj1) {...}

+0

+1, aiuta – greg0ire

+1

Fai attenzione agli oggetti stile "jquery/prototype": queste librerie aggiungono diverse funzioni a tutti oggetti che vengono iterati come se fossero anche chiavi ... In questo caso si desidera utilizzare la funzione Object.each() fornita dalla libreria fornita: http://api.jquery.com/jQuery.each/ Un po 'fuori tema, ma un po' importante ... – Igor

3
function getKeys(obj){ 
    var keys = []; 
    for (key in obj) { 
     if (obj.hasOwnProperty(key)) { keys[keys.length] = key; } 
    } 
    return keys; 
} 
+0

+1 per il controllo corretto con hasOwnProperty (anche se preferisco chiamarlo fuori dall'oggetto.prototipo) – JAAulde

1

Ecco implementazioni da phpjs.org:

Questo è non il mio codice, sto solo indicando una risorsa utile.

+1

Le funzioni che stai visualizzando sembrano restituire hash invece di matrici o è { 0: "test"} un sinonimo di ["test"]? – greg0ire

0

Ecco un buon esempio di array_keys da PHP.js library:

function array_keys (input, search_value, argStrict) { 
    // Return just the keys from the input array, optionally only for the specified search_value 

    var search = typeof search_value !== 'undefined', 
     tmp_arr = [], 
     strict = !!argStrict, 
     include = true, 
     key = ''; 

    for (key in input) { 
     if (input.hasOwnProperty(key)) { 
      include = true; 
      if (search) { 
       if (strict && input[key] !== search_value) { 
        include = false; 
       } 
       else if (input[key] != search_value) { 
        include = false; 
       } 
      } 

      if (include) { 
       tmp_arr[tmp_arr.length] = key; 
      } 
     } 
    } 

    return tmp_arr; 
} 

Lo stesso vale per array_values (from the same PHP.js library):

function array_values (input) { 
    // Return just the values from the input array 

    var tmp_arr = [], 
     key = ''; 

    for (key in input) { 
     tmp_arr[tmp_arr.length] = input[key]; 
    } 

    return tmp_arr; 
} 

EDIT: rimossi clausole inutili dal codice.

+0

Le funzioni che stai visualizzando sembrano restituire hash invece di matrici o è {0: "test"} un sinonimo di ["test"]? – greg0ire

+0

@ greg0ire Non sono sinonimi. '{0:" test "}' è un'istanza di 'Object', mentre' ["test"] 'è un'istanza di' Array'. Ma entrambi hanno un membro '0' di valore' "test" '. – Imp

+0

Ci sono oggetti e matrici in JavaScript. Hash di cui stai parlando è un oggetto. Se si osserva la riga con 'var tmp_arr = []', mostra che la variabile 'tmp_arr' è una matrice (' [] ') ma non un oggetto (' {} '). Quindi entrambi i metodi restituiscono gli array. – VisioN

0
var myHash = {"apples": 3, "oranges": 4, "bananas": 42} 
vals=(function(e){a=[];for (var i in e) a.push(e[i]); return a;})(myHash).join(',') 
keys=(function(e){a=[];for (var i in e) a.push( i); return a;})(myHash).join(',') 
console.log(vals,keys) 

fondamentalmente

array=(function(e){a=[];for (var i in e) a.push(e[i]); return a;})(HASHHERE) 
13

La seconda risposta (al momento della scrittura) dà:

var values = keys.map(function(v) { return myHash[v]; }); 

Ma io preferisco usare jQuery propria $.map:

var values = $.map(myHash, function(v) { return v; }); 

Dal jQuery si prende cura di c Compatibilità con ross-browser. Più è breve :)

In ogni caso, cerco sempre di essere il più funzionale possibile. Gli one-liner sono più belli dei loop.

Problemi correlati