获取JavaScript对象键列表


295

我有一个JavaScript对象,例如

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

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



@TJ我认为这并不完全相同。这是一个对象,重复项是一个JSON对象。
GuyT 2014年

如果您有下划线,则只需_.keys(your_object)
minhajul 2015年

1
由于自2010年以来情况发生了变化,因此最好接受最受欢迎的答案作为“答案”
Jonas Wilms

Answers:


341

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);


我不认为Javascript像PHP,在这里您可以完全跳过第一行?无论如何,建议不要这样做。
Bart van Heukelom

@Bart:不,JavaScript中的第一行是必需的。
丹尼尔·瓦萨洛

6
您应该在下面查看David Morrissey的评论,以了解其优势。有时采用这种方法会导致不需要的原型成员出现在中keys

2
@pat:如果您使用的是对象文字,那么只有在您扩展时才会发生Object.prototype,无论如何都不应该这样做。但是,对于自定义构造函数,您是对的。
Sasha Chedygov

@BartvanHeukelom甚至早在2010年6月就引起了通知,因为这意味着您正在隐式键入对象。分配[]给它(或array()返回它)会使其成为一个数组,然后可以安全地用作数组。
Niels Keurentjes 2014年

627

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

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


7
它可以在Chrome中运行的事实也意味着它可以在Node.js中运行,因为两者均基于V8 javascript引擎构建。
Homme Zwaagstra

9
@fet如今,是的。两年前还不算很多。
AlbertEngelB

4
请注意,这与for(key in ob)!不同。Object.keys不会列出原型中的键,但是.. in obj会列出。
艾伯特

9
IE8附带了@fet Windows7。尽其所能,除非人们停止使用IE8,否则这不可能是公认的答案。

1
在这里developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…处,您将找到一个JavaScript方法,该方法在旧浏览器中可以正常工作,并且不会覆盖新浏览器中的功能。另请参阅以下我的答案。
桑德罗(Sandro)2014年

27

Underscore.js使转换非常干净:

var keys = _.map(x, function(v, k) { return k; });

编辑:我想念你也可以这样做:

var keys = _.keys(x);

没错,实际的下划线是source:nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = function(obj,key){返回hasOwnProperty.call(obj,key); }; _.keys = nativeKeys || 函数(obj){如果(obj!== Object(obj))抛出新的TypeError('Invalid object'); var keys = []; for(obj中的var key)if( .has(obj,key))keys.push(key); 返回键;};
米格尔·亚历杭德罗·富恩特斯·洛佩兹

18

如果您只想要特定于该特定对象的键,而不想要任何派生的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

4
var keys = new Array();
for(var key in obj)
{
   keys[keys.length] = key;
}

var keyLength = keys.length;

要从对象访问任何值,可以使用obj [key];


您需要增加数组索引
Vivek

数组索引自动增加keys.length,对于每次迭代而言,值都会不同,因为每次迭代都会插入一个值。
2014年

4
obj = {'a':'c','b':'d'}

你可以试试:

[index for (index in obj)] 

这将返回:

['a','b']

获取键列表或

[obj[index] for (index in obj)]

获得价值


在Google Chrome v16.0.912.75中不起作用,但在Firefox v10.0中则起作用
RobM 2012年

4

阿努拉格人的回答基本上是正确的。但是,为了也支持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;
};
}());
}

3

请注意,在coffeescript中,这可以在所有浏览器和节点中完成

k for k of obj

因此

(1 for _ of obj).length

3

支持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;
};

3
var obj = {
   key1: 'value1',
   key2: 'value2',
   key3: 'value3',
   key4: 'value4'
}

console.log(Object.keys(obj));
console.log(Object.keys(obj).length)


3

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

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

var keys = [];
_.each( obj, function( val, key ) {
    keys.push(key);
});
console.log(keys.lenth, keys);

3

在JavaScript中,对象是具有属性和类型的独立实体。

对于阵列的形式从对象获取的值: 对象 .values(OBJ)// obj是您使用的对象名称 结果 - > [“VALUE1”,“VALUE2”,“值3”,“值4”]

为了从对象中以数组形式获取键: Object .keys(obj)// obj是您使用的对象名 结果 -> [“” key1“,” key2“,” key3“,” key4“]

由于这两个函数都返回数组,因此您可以使用length属性获取键的长度或值。例如- 对象 .values(OBJ)。长度 对象 .keys(OBJ)。长度


2

对于列出了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' */

2

使用ES6,您可以forEach用来遍历对象的键。要获取所有键,可以使用Object.keys它返回对象中的所有键

Object.keys(obj).forEach(function(keyValue, index, map) { 
  console.log(keyValue); 
});

以上代码段的简称是,只需一个参数

Object.keys(obj).forEach(function(keyValue) { 
  console.log(keyValue); 
});

1
       if(props.userType){
          var data = []
          Object.keys(props.userType).map(i=>{
                data.push(props.userType[i])
          })
          setService(data)
        }

0

使用切片,应用和联接方法。

var print = Array.prototype.slice.apply( obj );
alert('length='+print.length+' list'+print.join());
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.