获取object's键数组

我想获得一个JavaScript对象的键作为一个数组,无论是在jQuery或纯JavaScript。

还有比这更简洁的方法吗?

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
for (var key in foo) {
keys.push(key);
}
557482 次浏览

你可以使用jQuery的$.map

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' },
keys = $.map(foo, function(v, i){
return i;
});

使用Object.keys:

var foo = {
'alpha': 'puffin',
'beta': 'beagle'
};


var keys = Object.keys(foo);
console.log(keys) // ['alpha', 'beta']
// (or maybe some other order, keys are unordered).

这是ES5的一个特性。这意味着它可以在除在传统浏览器中不能工作之外的所有现代浏览器中工作。

ES5-shim有一个你可以窃取Object.keys的实现

我不知道是否更啰嗦,但我受到了一行请求的启发,将以下内容强制到一行中,尽管不知道它有多Pythonic;)

var keys = (function(o){var ks=[]; for(var k in o) ks.push(k); return ks})(foo);

当然,Object.keys()是获取对象键的最好的方法。如果它在你的环境中不可用,它可以使用你的例子中的代码简单地垫片(除非你需要考虑到你的循环将遍历原型链上的所有属性,不像Object.keys()的行为)。

然而,你的示例代码…

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
for (var key in foo) {
keys.push(key);
}

jsFiddle

...可以被修改。你可以在变量部分进行赋值。

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [], i = 0;
for (keys[i++] in foo) {}

jsFiddle

当然,这种行为不同于Object.keys()的实际行为(jsFiddle)。你可以简单地使用在MDN文档上添加shim

总结

要获取对象的所有键,可以使用Object.keys()Object.keys()接受一个对象作为参数,并返回一个包含所有键的数组。

例子:

const object = {
a: 'string1',
b: 42,
c: 34
};


const keys = Object.keys(object)


console.log(keys);


console.log(keys.length) // we can easily access the total amount of properties the object has

在上面的例子中,我们在keys const中存储了一个键数组。然后,我们可以通过检查keys数组的长度轻松访问对象上的属性数量。

使用Object.values()获取值

Object.keys()的补函数是Object.values()。这个函数以一个对象作为参数,并返回一个值数组。例如:

const object = {
a: 'random',
b: 22,
c: true
};




console.log(Object.values(object));

如果你决定使用Underscore.js,你最好这样做

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
_.each( foo, function( val, key ) {
keys.push(key);
});
console.log(keys);

如果你在这里找一些东西来列出一个n深度嵌套对象的键作为一个平面数组:

const getObjectKeys = (obj, prefix = '') => {
return Object.entries(obj).reduce((collector, [key, val]) => {
const newKeys = [ ...collector, prefix ? `${prefix}.${key}` : key ]
if (Object.prototype.toString.call(val) === '[object Object]') {
const newPrefix = prefix ? `${prefix}.${key}` : key
const otherKeys = getObjectKeys(val, newPrefix)
return [ ...newKeys, ...otherKeys ]
}
return newKeys
}, [])
}


console.log(getObjectKeys({a: 1, b: 2, c: { d: 3, e: { f: 4 }}}))

2022年,JavaScript还没有一个合理的方法来处理哈希?

这将发出警告,但有效:

Object.prototype.keys = function() { return Object.keys(this) }
console.log("Keys of an object: ", { a:1, b:2 }.keys() )


// Keys of an object:  Array [ "a", "b" ]
// WARN: Line 8:1:  Object prototype is read only, properties should not be added  no-extend-native

也就是说,扩展内置对象是有争议的