获取JavaScript对象键列表

use*_*820 288 javascript

我有一个像JavaScript的对象

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}
Run Code Online (Sandbox Code Playgroud)

如何获取此对象中的长度和键列表?

Anu*_*rag 617

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}
var keys = Object.keys(obj);
console.log('obj contains ' + keys.length + ' keys: '+  keys);
Run Code Online (Sandbox Code Playgroud)

它现在支持大多数主流浏览器.

  • @fet现在,是的.两年前,没有那么多. (9认同)
  • @fet windows7附带IE8.尽管如此,在人们停止使用IE8之前,这是不可能的. (9认同)
  • 它在Chrome中运行的事实也意味着它在Node.js中工作,因为它们都是在V8 javascript引擎上构建的. (7认同)
  • 请注意,这与`for(key in ob)`不同!`Object.keys`不会列出原型中的键,但是`..在obj`中. (3认同)

zed*_*xff 336

var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
};
var keys = [];

for (var k in obj) keys.push(k);

alert("total " + keys.length + " keys: " + keys);
Run Code Online (Sandbox Code Playgroud)

  • 你应该看看David Morrissey在下面的评论中找到一个边缘案例.有时采用这种方法会导致原型的不需要的成员出现在`keys`中. (6认同)
  • @pat:如果你正在使用对象文字,那只有在扩展`Object.prototype`时才会发生这种情况,你不应该这样做.但是,对于自定义构造函数,您是对的. (2认同)

mik*_*dge 25

Underscore.js使转换非常干净:

var keys = _.map(x, function(v, k) { return k; });
Run Code Online (Sandbox Code Playgroud)

编辑:我错过了你也可以这样做:

var keys = _.keys(x);
Run Code Online (Sandbox Code Playgroud)


cry*_*ryo 18

如果您只想要特定于该特定对象的键而不是任何派生prototype属性:

function getKeys(obj) {
    var r = []
    for (var k in obj) {
        if (!obj.hasOwnProperty(k)) 
            continue
        r.push(k)
    }
    return r
}
Run Code Online (Sandbox Code Playgroud)

例如:

var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays
Run Code Online (Sandbox Code Playgroud)