2014-11-14 11 views
7

Dies ist die Funktion, die ich schrieb, um alle Werte in einem bestimmten Objekt abzurufen.Abrufen aller Werte von einem JavaScript-Objekt

Gibt es einen eingebauten Weg, um alle Werte in einem Objekt abzurufen? So etwas existiert in Java für HashMaps. Ich weiß, JS hat eine Methode zum Abrufen aller Schlüssel, indem Sie Object.keys(obj) tun.

+5

'for..in' für Objekte besser geeignet scheint. – Shomz

+0

Wenn Sie Unterstriche verwenden, gibt es eine "Werte" -Funktion. –

+0

Nicht in JavaScript, aber es ist einfach zu machen. – PHPglue

Antwort

12

wohl knappste Weise eine Reihe von den Werten des Erhaltens innerhalb eines Objekts enthalten ist Object.keys und Array.prototype.map zu verwenden:

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

Ansonsten gibt es keine standardisierte Art und Weise eine Anordnung von einer Objektwert zu bekommen.

zur Iteration führt ES6 eine for..of Schleife, die durch ein Objekt der Werte iteriert wird:

von oben fort: wird
for (value of obj) { 
    console.log(value); //1, 2, 3 
} 

ES7 array comprehensions einzuführen geplant, so dass die Werte Array Erzeugen geschrieben werden konnte wie:

values = [for (x of Object.keys(obj)) obj[x]]; 
:

von oben fortgesetzt

Wenn Sie bereits Strich verwenden, können Sie die _.values Methode verwenden können:

von oben fort:
_.values(obj); //[1, 2, 3] 

Wenn Sie nur eine effiziente Implementierung für diese Nutzenfunktion möchten, die lodash source ist:

lodash.js v2.4.1 Linien 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

Eine weitere ES6-Möglichkeit: '[für (x von Object.keys (obj)) obj [x]]' –

+0

@squint, wäre es nicht einfach '[für (x von obj) x] '? – zzzzBov

+1

Ich weiß nicht, ob das geplant ist. Ich teste gerade in FF, und es sagt mir, dass es ein Syntaxfehler ist. Und mit '[für (x von obj) x]' sagt es mir, dass 'obj' kein Iterator ist. Weißt du, ob es sein wird? –

1

Sie Dazu könnte in neueren Browsern:

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'}); 

Wirklich, ich würde einfach tun:

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);