2014-11-14 63 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);