这将返回给定对象拥有的可枚举属性值的数组 . 您将获得与使用 for in 循环相同的值,但没有Prototype上的属性 . 这个例子可能会让事情变得更加清晰:
function person (name) {
this.name = name;
}
person.prototype.age = 5;
let dude = new person('dude');
for(let prop in dude) {
console.log(dude[prop]); // for in still shows age because this is on the prototype
} // we can use hasOwnProperty but this is not very elegant
// ES6 +
console.log(Object.values(dude));
// very concise and we don't show props on prototype
var objects={...}; this.getAllvalues = function () {
var vls = [];
for (var key in objects) {
vls.push(objects[key]);
}
return vls;
}
0
如果你真的想要一个值数组,我发现这比使用for ... in循环构建一个数组更干净 .
ECMA 5.1
function values(o) { return Object.keys(o).map(function(k){return o[k]}) }
值得注意的是,在大多数情况下,您并不真正需要一组值,执行此操作会更快:
for(var k in o) something(o[k]);
这将迭代Object o的键 . 在每次迭代中,k被设置为o的关键字 .
1
你可以循环键:
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
0
在 ECMAScript5 使用
keys = Object.keys(object);
否则,如果您的浏览器不支持它,请使用着名的 for..in loop
for (key in object) {
// your code here
}
14
显然 - 正如我最近学到的 - 这是最快的方法:
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]];
}
20 回答
ES5 Object.keys
使用
如果你使用谷歌浏览器打开控制台使用Ctrl Shift j
转到>>控制台
根据您必须支持的浏览器,可以通过多种方式完成此操作 . 绝大多数浏览器都支持ECMAScript 5(ES5),但要注意下面的许多示例都使用
Object.keys
,这在IE <9中不可用 . 请参阅compatibility table .ECMAScript 3
如果您必须支持旧版本的IE,那么这是您的选择:
嵌套的
if
确保您不会枚举对象原型链中的属性(这是您几乎肯定想要的行为) . 你必须使用而不是
因为ECMAScript 5允许您使用
Object.create(null)
创建无原型对象,并且这些对象不具有hasOwnProperty
方法 . 顽皮的代码也可能产生覆盖hasOwnProperty
方法的对象 .ECMAScript 5
您可以在任何支持ECMAScript 5及更高版本的浏览器中使用这些方法 . 这些从对象获取值并避免枚举原型链 .
obj
是你的对象:如果你想要一些更紧凑的东西,或者你想要小心循环中的函数,那么
Array.prototype.forEach
是你的朋友:下一个方法构建一个包含对象值的数组 . 这很方便循环 .
如果你想使用
Object.keys
安全地对抗null
(因为for-in
是),那么你可以做Object.keys(obj || {})...
.Object.keys
返回可枚举的属性 . 对于迭代简单对象,这通常就足够了 . 如果您有需要使用的非可枚举属性,可以使用Object.getOwnPropertyNames
代替Object.keys
.ECMAScript 2015(A.K.A . ES6)
使用ECMAScript 2015可以更容易地迭代数组 . 在循环中逐个处理值时,可以使用此优势:
使用ECMAScript 2015 fat-arrow函数,将对象映射到值数组成为一个单行:
ECMAScript 2015引入了
Symbol
,其实例可以用作属性名称 . 要获取要枚举的对象的符号,请使用Object.getOwnPropertySymbols
(此函数是Symbol
不能用于创建私有属性的原因) . 来自ECMAScript 2015的新Reflect
API提供Reflect.ownKeys
,它返回属性名称(包括不可枚举的)和符号的列表 .数组理解(不要尝试使用)
在发布之前,数组理解是来自ECMAScript 6的 removed . 在删除之前,解决方案看起来像:
ECMAScript 2017
ECMAScript 2016添加了不影响此主题的功能 . ECMAScript 2017规范添加了
Object.values
和Object.entries
. 两个返回数组(对于某些给定与Array.entries
的类比,这将是令人惊讶的) .Object.values
可以按原样使用,也可以使用for-of
循环 .如果您想同时使用键和值,那么
Object.entries
适合您 . 它生成一个填充[key, value]
对的数组 . 您可以在for-of
循环中使用它,或者(请注意ECMAScript 2015解构分配):Object.values shim
最后,正如评论和teh_senaus在另一个答案中所指出的那样,使用其中一个作为垫片可能是值得的 . 别担心,以下不会改变原型,它只是添加一个方法
Object
(这样危险性要小得多) . 使用fat-arrow函数,这也可以在一行中完成:你现在可以使用它
如果你想避免当本机
Object.values
存在时填充,那么你可以这样做:最后......
请注意您需要支持的浏览器/版本 . 在实现方法或语言功能的地方,上述内容是正确的 . 例如,默认情况下,在V8中默认关闭对ECMAScript 2015的支持,直到最近才支持Chrome浏览器 . 应该避免ECMAScript 2015的功能,直到您打算支持的浏览器实现您需要的功能 . 如果使用babel将代码编译为ECMAScript 5,则可以访问此答案中的所有功能 .
现在我使用Dojo Toolkit因为旧浏览器不支持
Object.values
.输出:
ECMA2017起:
Object.values(obj)
会将所有属性值作为数组提取 .https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
这是一个类似于PHP的array_values()的函数
如果您使用的是ES6或更高版本,以下是获取对象值的方法:
通过使用简单的
for..in
循环:这是一个可重用的函数,用于将值转换为数组 . 它也需要考虑原型 .
如果您可以访问Underscore.js,则可以使用_.values函数,如下所示:
使用如下的polyfill:
然后用
3)利润!
对于那些早期适应CofeeScript时代的人来说,这是另一个相当于它的人 .
这可能比这更好,因为
objects
可以减少再次输入并降低可读性 .我意识到'm a little late but here'是新的firefox 47
Object.values
方法的 shim与ES7兼容,即使某些浏览器还不支持它
自
Object.values(<object>)
将内置 ES7 &在等待所有浏览器支持它之前,您可以将其包装在函数中:
然后 :
一旦浏览器与ES7兼容,您就不必更改代码中的任何内容 .
使用:
Object.values()
,我们传入一个对象作为参数,并接收一个值数组作为返回值 .这将返回给定对象拥有的可枚举属性值的数组 . 您将获得与使用
for in
循环相同的值,但没有Prototype上的属性 . 这个例子可能会让事情变得更加清晰:Object.entries以更好的方式完成它 .
如果你真的想要一个值数组,我发现这比使用for ... in循环构建一个数组更干净 .
ECMA 5.1
值得注意的是,在大多数情况下,您并不真正需要一组值,执行此操作会更快:
这将迭代Object o的键 . 在每次迭代中,k被设置为o的关键字 .
你可以循环键:
将输出:
在 ECMAScript5 使用
否则,如果您的浏览器不支持它,请使用着名的
for..in loop
显然 - 正如我最近学到的 - 这是最快的方法: