如何获得一个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.values
和Object.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使用谷歌浏览器打开控制台
转到>>控制台