How to get all properties values of a Javascript Object (without knowing the keys)?
如果存在javascript对象:
1 | var objects={...}; |
假设它有50个以上的属性,而不知道属性名(即不知道"键"),如何在循环中获取每个属性值?
根据您必须支持哪些浏览器,这可以通过多种方式实现。Wild中绝大多数浏览器都支持EcmaScript 5(ES5),但需要注意的是,下面的许多示例都使用了
如果必须支持旧版本的IE,则可以选择:好的。
1 2 3 4 5 6 | for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var val = obj[key]; // use val } } |
嵌套的
1 | Object.prototype.hasOwnProperty.call(obj, key) // ok |
而不是好的。
1 | obj.hasOwnProperty(key) // bad |
因为ecmascript 5+允许您使用
您可以在任何支持ECMAScript 5及更高版本的浏览器中使用这些方法。它们从对象中获取值,并避免在原型链上枚举。其中
1 2 3 4 5 6 | var keys = Object.keys(obj); for (var i = 0; i < keys.length; i++) { var val = obj[keys[i]]; // use val } |
如果你想要一些更紧凑的东西,或者你想小心循环中的函数,那么
1 2 3 4 | Object.keys(obj).forEach(function (key) { var val = obj[key]; // use val }); |
下一个方法构建一个包含对象值的数组。这便于循环。好的。
1 2 3 4 5 | var vals = Object.keys(obj).map(function (key) { return obj[key]; }); // use vals array |
如果你想让使用
数组更容易与EcmaScript 2015迭代。当一个接一个循环处理值时,您可以利用这一点:好的。
1 2 3 4 | for (const key of Object.keys(obj)) { const val = obj[key]; // use val } |
使用ecmascript 2015 fat arrow函数,将对象映射到一个值数组将成为一行:好的。
1 2 3 | const vals = Object.keys(obj).map(key => obj[key]); // use vals array |
ecmascript 2015引入了
数组理解在发布前从ECMAScript 6中删除。在移除之前,解决方案应该是:好的。
1 2 3 | const vals = [for (key of Object.keys(obj)) obj[key]]; // use vals array |
ECMAScript 2017年+
ECMAScript 2016添加了不影响此主题的功能。ECMAScript 2017规范增加了
1 2 3 4 5 6 7 | const values = Object.values(obj); // use values array or: for (const val of Object.values(obj)) { // use val } |
如果您想同时使用键和值,那么
1 2 3 | for (const [key, val] of Object.entries(obj)) { // use key and val } |
最后,正如评论中提到的,以及Teh ou Senaus在另一个答案中提到的,使用其中一个作为垫片可能是值得的。不用担心,下面的内容并没有改变原型,只是在
1 | Object.values = obj => Object.keys(obj).map(key => obj[key]); |
你现在可以像这样使用好的。
1 2 | // ['one', 'two', 'three'] var values = Object.values({ a: 'one', b: 'two', c: 'three' }); |
如果您想避免在本地
1 | Object.values = Object.values || (obj => Object.keys(obj).map(key => obj[key])); |
最后…
了解需要支持的浏览器/版本。在实现方法或语言特性的地方,上述内容是正确的。例如,直到最近,在V8中,对EcmaScript 2015的支持在默认情况下被关闭,这为Chrome等浏览器提供了支持。在您打算支持的浏览器实现您需要的功能之前,应该避免使用EcmaScript 2015中的功能。如果您使用babel将代码编译为ecmascript 5,那么您就可以访问这个答案中的所有特性。好的。好啊。
通过使用一个简单的
1 2 3 | for(var key in objects) { var value = objects[key]; } |
这是一个可重用的函数,用于将值获取到数组中。它也考虑到了原型。
1 2 3 4 5 6 7 8 9 | Object.values = function (obj) { var vals = []; for( var key in obj ) { if ( obj.hasOwnProperty(key) ) { vals.push(obj[key]); } } return vals; } |
如果您可以访问underline.js,则可以使用这样的
1 | _.values({one : 1, two : 2, three : 3}); // return [1, 2, 3] |
如果您真的想要一个值数组,我发现这比用for…在循环中。
ECMA 5.1+
1 | function values(o) { return Object.keys(o).map(function(k){return o[k]}) } |
值得注意的是,在大多数情况下,您并不需要一个值数组,这样做会更快:
1 | for(var k in o) something(o[k]); |
这将迭代对象o的键。在每次迭代中,k都设置为o的键。
ES5-
1 2 3 | var a = { a: 1, b: 2, c: 3 }; Object.keys(a).map(function(key){ return a[key] }); // result: [1,2,3] |
您可以循环使用以下键:
1 2 3 4 | foo = {one:1, two:2, three:3}; for (key in foo){ console.log("foo["+ key +"]="+ foo[key]); } |
意志产出:
1 2 3 | foo[one]=1 foo[two]=2 foo[three]=3 |
对于那些早期适应咖啡脚本时代的人来说,这是另一个等价物。
1 | val for key,val of objects |
这可能比这更好,因为
1 | objects[key] for key of objects |
使用多边形填充,如:
1 | if(!Object.values){Object.values=obj=>Object.keys(obj).map(key=>obj[key])} |
然后使用
1 | Object.values(my_object) |
3)利润!
显然,正如我最近所了解的,这是最快的方法:
1 2 3 4 5 6 | 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]]; } |
ECMA2017 onwards:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
Use:
This returns an array of a given object own enumerable property values. You will get the same values as by using the
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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 |
这是一个类似于php数组_Values()的函数
1 2 3 4 5 | function array_values(input) { var output = [], key = ''; for ( key in input ) { output[output.length] = input[key]; } return output; } |
以下是使用ES6或更高版本时如何获取对象值:
1 | Array.from(values(obj)); |
我知道我有点晚了,但这里有一个新的firefox 47
1 2 3 4 5 | Object.prototype.values = Object.prototype.values || function(obj) { return this.keys(obj).map(function(key){ return obj[key]; }); }; |
与ES7兼容,甚至有些浏览器还不支持它
因为,
在等待所有浏览器都支持它之前,您可以将它包装在一个函数中:
1 | Object.vals=(o)=>(Object.values)?Object.values(o):Object.keys(o).map((k)=>o[k]) |
然后:
1 2 | Object.vals({lastname:'T',firstname:'A'}) // ['T','A'] |
一旦浏览器与ES7兼容,就不必更改代码中的任何内容。
object.entries做得更好。
1 2 3 4 5 6 7 8 | var dataObject = {"a":{"title":"shop <hr>[cc lang="javascript"]var objects={...}; this.getAllvalues = function () { var vls = []; for (var key in objects) { vls.push(objects[key]); } return vls; } |
在ECMAScript5中使用
1 | keys = Object.keys(object); |
否则,如果您的浏览器不支持它,请使用著名的
1 2 3 | for (key in object) { // your code here } |
现在我使用Dojo工具包是因为旧的浏览器不支持
1 2 3 4 5 | require(['dojox/lang/functional/object'], function(Object) { var obj = { key1: '1', key2: '2', key3: '3' }; var values = Object.values(obj); console.log(values); }); |
输出:
1 | ['1', '2', '3'] |
使用
1 | console.log(variable) |
如果您使用Google Chrome,请使用ctrl+shift+j打开控制台
Goto >控制台