451

我想以 jQuery 或纯 JavaScript 的形式将 JavaScript 对象的键作为数组获取。

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

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

8 回答 8

725

使用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

于 2012-01-06T19:19:59.137 回答
59

您可以使用 jQuery 的$.map.

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' },
keys = $.map(foo, function(v, i){
  return i;
});
于 2012-01-06T19:18:22.553 回答
36

当然,Object.keys()最好的方法是获取一个 Object 的键。如果它在您的环境中不可用,则可以使用示例中的代码对其进行简单的填充(除非您需要考虑到您的循环将遍历原型链上的所有属性,这与Object.keys()'s 的行为不同)。

但是,您的示例代码...

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

js小提琴

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

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

js小提琴

当然,这种行为与Object.keys()实际行为不同(jsFiddle)。您可以简单地使用MDN 文档中的 shim

于 2012-06-08T03:58:35.163 回答
9

如果您在这里寻找将 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 }}}))

于 2019-03-23T02:41:03.053 回答
7

我不知道不那么冗长,但我受到启发,通过单行请求将以下内容强制到一行,但不知道它是如何 Pythonic 的;)

var keys = (function(o){var ks=[]; for(var k in o) ks.push(k); return ks})(foo);
于 2012-01-06T19:29:35.000 回答
5

概括

要获取对象的所有键,您可以使用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

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

通过以下方式获取值:Object.values()

的互补功能Object.keys()Object.values()。此函数接受一个对象作为参数并返回一个值数组。例如:

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


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

于 2018-08-17T08:39:33.210 回答
1

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

var foo = { 'alpha' : 'puffin', 'beta' : 'beagle' };
var keys = [];
_.each( foo, function( val, key ) {
    keys.push(key);
});
console.log(keys);
于 2019-01-09T06:04:52.307 回答
0

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

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

于 2021-12-17T02:16:00.827 回答