2014-11-14 19 views
7

Bu, belirli bir nesnede tüm değerleri almak için yazdığım işlevdir.Bir JavaScript nesnesindeki tüm değerleri alma

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

Nesnede tüm değerleri almanın yerleşik bir yolu var mı? HashMaps için böyle bir şey var java'da. JS'nin, tüm anahtarları Object.keys(obj) yaparak geri almak için bir yöntemi olduğunu biliyorum.

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

Aksi bir nesnenin değer dizisi almanın hiçbir standartlaştırılmış bir yolu vardır:

+5

'for..in' nesneler için daha uygun görünmektedir. Alt çizgi kullanıyorsanız – Shomz

+0

- bir 'değerler 'işlevi vardır. –

+0

Düz javascriptte yok, ancak yapılması çok kolay. – PHPglue

cevap

12

Muhtemelen bir nesne yer alan değerler dizisi almanın en özlü yolu Object.keys ve Array.prototype.map kullanmaktır.

yukarıdan devam:
for (value of obj) { 
    console.log(value); //1, 2, 3 
} 

ES7 array comprehensions tanıtmak için planlanan, bu değerler dizisi yazılabilir üreten

iterating için

, ES6 bir nesnenin değerleri arasında yineleme bir for..of döngü getirmektedir edilmiştir:

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

yukarıdan devam

yukarıdan devam etti:: Zaten alt çizgi kullanıyorsanız

, sen _.values yöntemi kullanabilirsiniz sadece bu yarar fonksiyonu için etkili bir uygulama istiyorsanız

_.values(obj); //[1, 2, 3] 

, lodash source geçerli:

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

Başka bir ES6 olanağı:' [için (Object.keys (obj) 'den x) x [x]] –

+0

@quint, sadece "için) x] '? – zzzzBov

+1

Planlanmış mı bilmiyorum. Şu an sadece FF'de test yapıyorum ve bana bir sözdizimi hatası verdiğini söylüyor. Ve [için (obj x)] ile bana “obj” bir yineleyici olmadığını söyler. Olur mu, biliyor musun? –

1

You yeni tarayıcılar içinde, bu yapabilirdi:

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

Gerçekten, tıpkı olacaktır:

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); 
İlgili konular