2014-11-14 62 views
7

這是我寫的用於檢索給定對象中所有值的函數。檢索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; 
} 

是否有任何內置的方法來檢索對象中的所有值?像這樣的東西存在於Java的HashMaps。我知道JS通過做Object.keys(obj)來檢索所有密鑰。

+5

'for..in'似乎更適合的對象。 – Shomz

+0

如果你正在使用下劃線 - 有一個'values'函數。 –

+0

不是用普通的JavaScript,但它很容易製作。 – PHPglue

回答

12

可能獲得目標文件內包含的值的數組的最簡潔的方法是使用Object.keysArray.prototype.map

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

否則有越來越對象的值的陣列中的標準化方式。

對於迭代,ES6引入for..of環將通過一個對象的值進行迭代:

從上方繼續:
for (value of obj) { 
    console.log(value); //1, 2, 3 
} 

ES7被提名介紹array comprehensions,因此生成的值陣列可以寫成爲:

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

從上方繼續

如果您已經使用下劃線,你可以使用_.values方法:

從上面繼續說道:
_.values(obj); //[1, 2, 3] 

如果你只是想爲這個效用函數的有效實施,該lodash source是:

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

另一個ES6的可能性:'[for(x of Object.keys(obj))obj [x]]' –

+0

@squint,它會不會只是'[for(x of obj )x]'? – zzzzBov

+1

我不知道這是否計劃。我現在只是在FF中測試,它告訴我這是一個語法錯誤。用'[for(x of obj)x]'告訴我'obj'不是一個迭代器。你知道它會是嗎? –

1

你能做到這一點,在新的瀏覽器:

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

真的,我只想做:

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