如何获得一个Javascript对象的所有属性值(不知道键)?

如果有一个Javascript对象:

var objects={...}; 

假设它有超过50个属性,而不知道属性名称(不知道“键”)如何获得每个属性值的循环?

通过使用一个简单的for..in循环:

 for(var key in objects) { var value = objects[key]; } 

根据您必须支持哪些浏览器,可以通过多种方式完成此操作。 绝大多数浏览器都支持ECMAScript 5(ES5),但需要注意的是,下面的许多例子都使用了Object.keys ,这在IE <9中是不可用的。请参阅兼容性表 。

ECMAScript 3+

如果您必须支持较旧版本的IE,那么这是您的select:

 for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var val = obj[key]; // use val } } 

嵌套的if确保不会枚举对象的原型链中的属性(这是您几乎可以肯定需要的行为)。 你必须使用

 Object.prototype.hasOwnProperty.call(obj, key) // ok 

而不是

 obj.hasOwnProperty(key) // bad 

因为ECMAScript 5+允许使用Object.create(null)创build无原型的对象,而这些对象将不具有hasOwnProperty方法。 顽皮的代码也可能产生覆盖hasOwnProperty方法的对象。

ECMAScript 5+

您可以在任何支持ECMAScript 5及更高版本的浏览器中使用这些方法。 这些从一个对象获取值,并避免枚举原型链。 obj是你的客体:

 var keys = Object.keys(obj); for (var i = 0; i < keys.length; i++) { var val = obj[keys[i]]; // use val } 

如果你想要一些更紧凑的东西,或者你想要循环中的函数小心,那么Array.prototype.forEach是你的朋友:

 Object.keys(obj).forEach(function (key) { var val = obj[key]; // use val }); 

下一个方法构build一个包含对象值的数组。 这对于循环是很方便的。

 var vals = Object.keys(obj).map(function (key) { return obj[key]; }); // use vals array 

如果你想要使用Object.keys这些对象是null (as for-in是),那么你可以做Object.keys(obj || {})...

Object.keys返回可枚举的属性。 为了迭代简单的对象,这通常是足够的。 如果你有需要使用的非枚举属性,你可以使用Object.getOwnPropertyNames代替Object.keys

ECMAScript 2015+(又名ES6)

使用ECMAScript 2015可以更容易地进行数组迭代。在循环中逐个处理值时,可以使用这个优势:

 for (const key of Object.keys(obj)) { const val = obj[key]; // use val } 

使用ECMAScript 2015胖箭头函数,将对象映射到一个值的数组变成了一行:

 const vals = Object.keys(obj).map(key => obj[key]); // use vals array 

ECMAScript 2015引入了Symbol ,其实例可以用作属性名称。 要获得枚举对象的符号,使用Object.getOwnPropertySymbols (这个函数是为什么Symbol 不能用来创build私有属性)。 来自ECMAScript 2015的新Reflect API提供了Reflect.ownKeys ,它返回属性名称(包括非枚举属性)和符号的列表。

数组理解(不要尝试使用)

在发布之前,数组理解从ECMAScript 6中删除 。 在移除之前,解决scheme应该是这样的:

 const vals = [for (key of Object.keys(obj)) obj[key]]; // use vals array 

ECMAScript 2017+

ECMAScript 2016添加了不影响此主题的function。 ECMAScript 2017规范添加了Object.valuesObject.entries 。 两个返回数组(这将令人惊讶的一些给与Array.entries类比)。 Object.values可以按Object.values使用,也可以使用for-of循环。

 const values = Object.values(obj); // use values array or: for (const val of Object.values(obj)) { // use val } 

如果你想同时使用键和值,那么Object.entries是你的。 它产生一个用[key, value]对填充的数组。 您可以按原样使用它,或者(也请注意ECMAScript 2015解构赋值)在for-of循环中:

 for (const [key, val] of Object.entries(obj)) { // use key and val } 

Object.values垫片

最后,如评论和teh_senaus在另一个答案中所指出的那样,可能值得使用其中之一作为垫片。 不要担心,下面的代码不会改变原型,它只是给Object添加一个方法(这个方法不那么危险)。 使用胖箭头function,也可以在一行中完成:

 Object.values = obj => Object.keys(obj).map(key => obj[key]); 

你现在可以使用它

 // ['one', 'two', 'three'] var values = Object.values({ a: 'one', b: 'two', c: 'three' }); 

如果你想避免当一个本地的Object.values存在Object.values ,那么你可以做:

 Object.values = Object.values || (obj => Object.keys(obj).map(key => obj[key])); 

最后…

请注意您需要支持的浏览器/版本。 上述方法或语言function的实现是正确的。 例如,直到最近,在V8中,默认情况下,对ECMAScript 2015的支持都是closures的,这些浏览器支持Chrome等浏览器。 应该避免ECMAScript 2015的function,直到您打算支持的浏览器实现您需要的function为止。 如果您使用babel将代码编译为ECMAScript 5,则可以访问此答案中的所有function。

这是一个可重用的函数,用于将值存入数组。 它也考虑到原型。

 Object.values = function (obj) { var vals = []; for( var key in obj ) { if ( obj.hasOwnProperty(key) ) { vals.push(obj[key]); } } return vals; } 

如果你有权访问underscore.js,你可以像这样使用_.values函数:

 _.values({one : 1, two : 2, three : 3}); // return [1, 2, 3] 

如果你真的想要一个值的数组,我发现比使用for … in循环构build一个数组更清洁。

ECMA 5.1+

 function values(o) { return Object.keys(o).map(function(k){return o[k]}) } 

值得注意的是,在大多数情况下,你并不需要一组值,这样做会更快:

 for(var k in o) something(o[k]); 

这遍历了对象o的键。 在每次迭代中,k被设置为o的一个键。

您可以循环键:

 foo = {one:1, two:2, three:3}; for (key in foo){ console.log("foo["+ key +"]="+ foo[key]); } 

会输出:

 foo[one]=1 foo[two]=2 foo[three]=3 
 a = {a:1,b:2,c:3} Object.keys(a).map(function(key){return a[key]}) result: [1,2,3] 

对于那些早期适应CofeeScript时代的人来说,这里还有另外一个相同的东西。

 val for key,val of objects 

这可能比这更好,因为可以减lessobjects再次input并降低可读性。

 objects[key] for key of objects 

显然 – 正如我最近学到的 – 这是最快的方法:

 var objs = {...}; var objKeys = Object.keys(obj); for (var i = 0, objLen = objKeys.length; i < objLen; i++) { // do whatever in here var obj = objs[objKeys[i]]; } 

使用像下面这样的polyfill:

 if(!Object.values){Object.values=obj=>Object.keys(obj).map(key=>obj[key])} 

然后使用

 Object.values(my_object) 

3)利润!

您可以使用我编写的这个对象值组件来获取所有的对象值。

例子:

 values({ a: 1, b: 2, c: 3 }) // => [1, 2, 3] 

下面是它的工作原理:

 function values(object: {[any]: any}): any[] { const objValues = []; forEach(object, val => objValues.push(val)); return objValues; }; 

这个MPM 微型封装也可以做到这一点。

这里有一个类似于PHP的array_values()

 function array_values(input) { var output = [], key = ''; for ( key in input ) { output[output.length] = input[key]; } return output; } 

以下是如何使用ES6或更高版本获取对象的值:

 Array.from(values(obj)); 

更好的方法是将一些函数附加到Object原型,以便您可以获取调用properties()的每个对象的属性

 Object.prototype.properties=function(){ var result=[]; for(var property in this){ if (this.hasOwnProperty(property)){ result.push(property); } return result; } 

与ES7兼容,甚至有些浏览器还不支持

由于Object.values(<object>)将内置于ES7

在等待所有的浏览器支持它之前,你可以把它包装在一个函数中:

 Object.vals=(o)=>(Object.values)?Object.values(o):Object.keys(o).map((k)=>o[k]) 

然后 :

 Object.vals({lastname:'T',firstname:'A'}) // ['T','A'] 

一旦浏览器与ES7兼容,您将不必在代码中更改任何内容。

 var objects={...}; this.getAllvalues = function () { var vls = []; for (var key in objects) { vls.push(objects[key]); } return vls; } 

我意识到我有点晚了,但这里是一个新的firefox 47 Object.values方法的垫脚

 Object.prototype.values = Object.prototype.values || function(obj) { return this.keys(obj).map(function(key){ return obj[key]; }); }; 

ECMAScript5中使用

  keys = Object.keys(object); 

否则,如果你的浏览器不支持它,请使用众所周知的for..in loop

 for (key in object) { // your code here } 

对不起,我的旧回答:D

现在我使用dojotokit becouse旧的浏览器不suport(Object.values)

 require(['dojox/lang/functional/object'], function(Object) { var obj = {key1: '1', key2: '2', key3:'3'}; var values = Object.values(obj); console.log(values); }); 

输出:

['1','2','3']

使用

 console.log(variable) 

如果您使用Ctrl + Shift + j使用谷歌浏览器打开控制台

转到>>控制台