如何获取Javascript对象的所有属性值(不知道密钥)?

How to get all properties values of a Javascript Object (without knowing the keys)?

如果存在javascript对象:

1
var objects={...};

假设它有50个以上的属性,而不知道属性名(即不知道"键"),如何在循环中获取每个属性值?


根据您必须支持哪些浏览器,这可以通过多种方式实现。Wild中绝大多数浏览器都支持EcmaScript 5(ES5),但需要注意的是,下面的许多示例都使用了Object.keys,这在IE<9中不可用。请参见兼容性表。好的。ECMAScript 3 +

如果必须支持旧版本的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
    }
}

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

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

而不是好的。

1
obj.hasOwnProperty(key) // bad

因为ecmascript 5+允许您使用Object.create(null)创建无原型对象,而这些对象将没有hasOwnProperty方法。淘气的代码也可能产生覆盖hasOwnProperty方法的对象。好的。ECMAScript 5 +

您可以在任何支持ECMAScript 5及更高版本的浏览器中使用这些方法。它们从对象中获取值,并避免在原型链上枚举。其中obj是您的目标:好的。

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
}

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

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

如果你想让使用Object.keys的人对null安全(就像for-in一样),那么你可以使用Object.keys(obj || {})...。好的。

Object.keys返回可枚举属性。对于简单对象的迭代,这通常是足够的。如果您有一些不可枚举的属性需要使用,您可以使用Object.getOwnPropertyNames代替Object.keys。好的。ECMAScript 2015+(A.K.A.ES6)

数组更容易与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引入了Symbol,其中的实例可以用作财产名称。要获得要枚举的对象的符号,请使用Object.getOwnPropertySymbols(此函数是Symbol不能用于生成私有属性的原因)。ecmascript 2015的新ReflectAPI提供了Reflect.ownKeys,它返回属性名(包括不可枚举的)和符号列表。好的。数组理解(不要尝试使用)

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

1
2
3
const vals = [for (key of Object.keys(obj)) obj[key]];

// use vals array

ECMAScript 2017年+

ECMAScript 2016添加了不影响此主题的功能。ECMAScript 2017规范增加了Object.valuesObject.entries。两个返回数组(考虑到与Array.entries的相似性,有些人会感到惊讶)。Object.values可以按原样使用,也可以与for-of循环一起使用。好的。

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
}

如果您想同时使用键和值,那么Object.entries是为您准备的。它生成一个数组,其中填充了[key, value]对。您可以按原样使用它,也可以在for-of循环中使用(也请注意ecmascript 2015销毁分配):好的。

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

Object.values垫片

最后,正如评论中提到的,以及Teh ou Senaus在另一个答案中提到的,使用其中一个作为垫片可能是值得的。不用担心,下面的内容并没有改变原型,只是在Object中添加了一个方法(这就不那么危险了)。使用fat arrow函数,这也可以在一行中完成:好的。

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' });

如果您想避免在本地Object.values存在时加垫片,则可以执行以下操作:好的。

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

最后…

了解需要支持的浏览器/版本。在实现方法或语言特性的地方,上述内容是正确的。例如,直到最近,在V8中,对EcmaScript 2015的支持在默认情况下被关闭,这为Chrome等浏览器提供了支持。在您打算支持的浏览器实现您需要的功能之前,应该避免使用EcmaScript 2015中的功能。如果您使用babel将代码编译为ecmascript 5,那么您就可以访问这个答案中的所有特性。好的。好啊。


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

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,则可以使用这样的_.values函数:

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-Object.keys

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

这可能比这更好,因为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:

Object.values(obj) will fetch you all the property values as an array.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values


Use: Object.values(), we pass in an object as an argument and receive an array of the values as a return value.

This returns an array of a given object own enumerable property values. You will get the same values as by using the for in loop but without the properties on the Prototype. This example will probably make things clearer:

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 Object.values方法的补充。

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


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

因为,Object.values()将内置于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);

否则,如果您的浏览器不支持它,请使用著名的for..in loop

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


现在我使用Dojo工具包是因为旧的浏览器不支持Object.values

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 >控制台