我有一个类似以下的JavaScript对象:
var obj = {
key1: 'value1',
key2: 'value2',
key3: 'value3',
key4: 'value4'
}
我怎样才能获得这个对象的键列表和长度?
var obj = {
key1: 'value1',
key2: 'value2',
key3: 'value3',
key4: 'value4'
}
我怎样才能获得这个对象的键列表和长度?
var obj = {
key1: 'value1',
key2: 'value2',
key3: 'value3',
key4: 'value4'
}
var keys = Object.keys(obj);
console.log('obj contains ' + keys.length + ' keys: '+ keys);
现在大多数主流浏览器都支持它。
for(key in ob)
不同!Object.keys
不会列出原型链上的键,但 .. in obj
会。 - Albertvar obj = {
key1: 'value1',
key2: 'value2',
key3: 'value3',
key4: 'value4'
};
var keys = [];
for (var k in obj) keys.push(k);
console.log("total " + keys.length + " keys: " + keys);
Object.prototype
的情况下,而你本来就不应该这样做。但对于自定义的构造函数,你是正确的。 - Sasha Chedygov[]
(或当时的array()
)分配给它会使其成为一个数组,您可以安全地将其用作数组。 - Niels Keurentjes[]=
运算符,但是在 JavaScript 中,当你执行 myUndefinedVar.push
时,你正在尝试从类型为 'undefined'
的对象中检索属性 push
,这会导致引用错误;请注意,我甚至还没有输入 push 后面的括号和参数。 - RivenfallUnderscore.js 让转换变得非常干净:
var keys = _.map(x, function(v, k) { return k; });
编辑:我错过了你也可以这样做:
var keys = _.keys(x);
prototype
属性:function getKeys(obj) {
var r = []
for (var k in obj) {
if (!obj.hasOwnProperty(k))
continue
r.push(k)
}
return r
}
e.g:
var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays
首先,Anurags的回答基本上是正确的。但是为了支持所有浏览器版本,您可以使用下面的代码来支持Object.keys(obj)
,该代码摘自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys。该代码会在浏览器不支持Object.keys(obj)
的情况下添加这个方法。
if (!Object.keys) {
Object.keys = (function() {
'use strict';
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !({ toString: null }).propertyIsEnumerable('toString'),
dontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
],
dontEnumsLength = dontEnums.length;
return function(obj) {
if (typeof obj !== 'object' && (typeof obj !== 'function' || obj === null)) {
throw new TypeError('Object.keys called on non-object');
}
var result = [], prop, i;
for (prop in obj) {
if (hasOwnProperty.call(obj, prop)) {
result.push(prop);
}
}
if (hasDontEnumBug) {
for (i = 0; i < dontEnumsLength; i++) {
if (hasOwnProperty.call(obj, dontEnums[i])) {
result.push(dontEnums[i]);
}
}
}
return result;
};
}());
}
obj = {'a':'c','b':'d'}
[index for (index in obj)]
这将返回:
['a','b']
[obj[index] for (index in obj)]
获取数值
var keys = new Array();
for(var key in obj)
{
keys[keys.length] = key;
}
var keyLength = keys.length;
要从对象中访问任何值,您可以使用obj[key];
keys.length
,每次迭代都不同,因为每次迭代都会插入一个值。 - KrekkieD使用Object.keys()
...这是正确的方法。
有关完整文档,请参阅下面链接的MDN网站:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
现代浏览器支持:
var obj = {
key1: 'value1',
key2: 'value2',
key3: 'value3',
key4: 'value4'
}
console.log(Object.keys(obj));
// we can also get values
console.log(Object.values(obj));
对于支持 ECMAScript 5 的浏览器,可以使用递归解决方案:
var getObjectKeys = function(obj) {
var keys = Object.keys(obj);
var length = keys.length;
if (length !== 0) {
for (var i = 0; i < length; i++) {
if (typeof obj[keys[i]] === 'object') {
keys[keys[i]] = getObjectKeys(obj[keys[i]]);
}
}
}
return keys;
};