2014-11-14 13 views
7

Questa è la funzione che ho scritto per recuperare tutti i valori in un dato oggetto.Recupero di tutti i valori da un oggetto JavaScript

function getValues(data){ 
    var keys = Object.keys(data); 
    var values = []; 
    for(var i = 0, l = keys.length, key; i< l; i++){ 
     key = keys[i]; 
     values.push(data[key]); 
    } 
    return values; 
} 

C'è un modo incorporato per recuperare tutti i valori in un oggetto? Qualcosa di simile esiste in Java per HashMaps. So che JS ha un metodo per recuperare tutte le chiavi facendo Object.keys(obj).

+5

'for..in' sembra più adatto per gli oggetti. – Shomz

+0

se si utilizza underscore - esiste una funzione 'values'. –

+0

Non in semplice JavaScript, ma è semplice da realizzare. – PHPglue

risposta

12

Probabilmente il modo più conciso di ottenere una matrice dei valori contenuti all'interno di un oggetto è quello di utilizzare Object.keys e Array.prototype.map:

obj = { 
    a: 1, 
    b: 2, 
    c: 3 
}; 
values = Object.keys(obj).map(function (key) { 
    return obj[key]; 
}); 

Altrimenti non c'è modo standardizzato di ottenere un array di valori di un oggetto.

Per iterazione, ES6 introduce un loop for..of che scorrere i valori di un oggetto:

continuato dall'alto:
for (value of obj) { 
    console.log(value); //1, 2, 3 
} 

ES7 è previsto per introdurre array comprehensions, generando così la matrice valori potrebbe essere scritta come:

continuato dall'alto:
values = [for (x of Object.keys(obj)) obj[x]]; 

Se stai già utilizzando sottolineatura, è possibile utilizzare il metodo _.values:

continuato dall'alto:
_.values(obj); //[1, 2, 3] 

Se si desidera solo un'implementazione efficace per questa funzione di utilità, il lodash source è:

linee lodash.js V2.4.1 2891-2914
/** 
* Creates an array composed of the own enumerable property values of `object`. 
* 
* @static 
* @memberOf _ 
* @category Objects 
* @param {Object} object The object to inspect. 
* @returns {Array} Returns an array of property values. 
* @example 
* 
* _.values({ 'one': 1, 'two': 2, 'three': 3 }); 
* // => [1, 2, 3] (property order is not guaranteed across environments) 
*/ 
function values(object) { 
    var index = -1, 
     props = keys(object), 
     length = props.length, 
     result = Array(length); 

    while (++index < length) { 
    result[index] = object[props[index]]; 
    } 
    return result; 
} 
+2

Un'altra possibilità ES6: '[for (x di Object.keys (obj)) obj [x]]' –

+0

@squint, non sarebbe solo '[per (x di obj) x] '? – zzzzBov

+1

Non so se è pianificato. Sto solo testando FF in questo momento e mi dice che si tratta di un errore di sintassi. E con '[for (x of obj) x]' mi dice che 'obj' non è un iteratore. Sai se sarà? –

1

È potrebbe fare questo, nei browser più recenti:

Object.defineProperty(Object.prototype, 'values', { 
    get:function(){ 
    return function(o){ 
     var a = []; 
     for(var i in o){ 
     a.push(o[i]); 
     } 
     return a; 
    } 
    } 
}); 
var arrayOfValues = Object.values({a:'A',b:'B',c:'C'}); 

Davvero, vorrei solo fare:

function objectValues(obj, inherited){ 
    var a = []; 
    for(var i in obj){ 
    var v = obj[i]; 
    if(inherited){ 
     a.push(v); 
    } 
    else if(obj.hasOwnProperty(i)){ 
     a.push(v); 
    } 
    } 
    return a; 
} 
var notInheritedArrayOfValues = objectValues({a:'A',b:'B',c:'C'}); 
var inheritedArrayOfValues = objectValues({a:'A',b:'B',c:'C'}, true); 
Problemi correlati