如何获取JavaScript对象密钥列表?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (10)
  • 关注 (0)
  • 查看 (92)

以下为我的JavaScript对象:

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);
用户回答回答于

支持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;
};
用户回答回答于

对于列出JSON对象键的逗号分隔字符串,可以尝试以下代码:

function listKeys(jObj){
    var keyString = '';
    for(var k in jObj){
        keyString+=(','+k);
    }
    return keyString.slice(1);
}



/* listKeys({'a' : 'foo', 'b' : 'foo', 'c' : 'foo'}) -> 'a,b,c' */
用户回答回答于

请注意,在coffeescript中,这可以在所有浏览器和节点中实现。

k for k of obj

所以

(1 for _ of obj).length
用户回答回答于
var keys = new Array();
for(var key in obj)
{
   keys[keys.length] = key;
}

var keyLength = keys.length;

若要访问object的任何值,可以使用obj[key];

用户回答回答于

在旧的浏览器中,支持Object.keys(obj)的话可以使用下面的代码,这些代码是从https://developer.mozilla.org/en-US/docs/web/JavaScript/Reference/Global_Objects/Objects/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)]

得到值

用户回答回答于

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

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

例如:

var keys = getKeys({'eggs': null, 'spam': true})
var length = keys.length // access the `length` property as usual for arrays
用户回答回答于

js使转换变得非常干净:

var keys = _.map(x, function(v, k) { return k; });
var keys = _.keys(x);
用户回答回答于
var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}
var keys = Object.keys(obj);
console.log('obj contains ' + keys.length + ' keys: '+  keys);

支持大多数主流浏览器。

它是ECMAScript 5中的一个附加版本,目前只在Chrome上生效。

扫码关注云+社区

领取腾讯云代金券