【问题标题】:Getting JavaScript object key list获取 JavaScript 对象键列表
【发布时间】:2011-03-05 08:32:11
【问题描述】:

我有一个类似的 JavaScript 对象

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

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

【问题讨论】:

  • @TJ 我认为这并不完全一样。这是一个对象,副本是一个 JSON 对象。
  • 如果你有下划线,那么简单的 _.keys(your_object)
  • 自 2010 年以来情况发生了变化,最好将最受好评的答案作为“答案”接受

标签: javascript


【解决方案1】:

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

现在大多数主流浏览器上都是supported

【讨论】:

  • 它在 Chrome 中工作的事实也意味着它在 Node.js 中工作,因为两者都是基于 V8 javascript 引擎构建的。
  • @fet 现在,是的。两年前,不是那么多。
  • 请注意,这与for(key in ob) 不同! Object.keys 不会列出原型中的键,但 .. in obj 会。
  • @fet windows7 带有 IE8。尽管它很棒,但在人们停止使用 IE8 之前,这不可能是公认的答案。
  • 在这里developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 您可以找到一种在旧浏览器中正常工作并且不会覆盖新浏览器中的功能的 JavaScript 方法。另请参阅下面的答案。
【解决方案2】:

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

【讨论】:

  • 我不认为 Javascript 和 PHP 一样,可以完全跳过第一行?无论如何,不​​建议这样做。
  • @Bart:不,在 JavaScript 中第一行是必需的。
  • 您应该在下面查看 David Morrissey 的评论,了解此处的边缘案例。有时采用这种方法会导致原型中不需要的成员出现在keys
  • @pat:如果您使用的是对象字面量,那么只有在扩展 Object.prototype 时才会发生这种情况,无论如何您都不应该这样做。不过,对于自定义构造函数,您是对的。
  • @BartvanHeukelom 甚至早在 2010 年 6 月就引起了通知,因为这意味着您正在隐式键入对象。将[] 分配给它(或当时的array())使其成为一个数组,然后您可以安全地将其用作数组。
【解决方案3】:

Underscore.js 使转换非常干净:

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

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

var keys = _.keys(x);

【讨论】:

  • 没错,实际下划线出处:nativeKeys = Object.keys; hasOwnProperty = ObjProto.hasOwnProperty; .has = function(obj, key) { return hasOwnProperty.call(obj, key); }; _.keys = nativeKeys || function(obj) { if (obj !== Object(obj)) throw new TypeError('Invalid object');变量键 = []; for (var key in obj) if (.has(obj, key)) keys.push(key);返回键; };
【解决方案4】:

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

【讨论】:

    【解决方案5】:
    var keys = new Array();
    for(var key in obj)
    {
       keys[keys.length] = key;
    }
    
    var keyLength = keys.length;
    

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

    【讨论】:

    • 你需要增加数组索引
    • 数组索引自动递增keys.length,每次迭代都不同,因为每次迭代都会插入一个值。
    【解决方案6】:
    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 中可以使用
    【解决方案7】:

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

    【讨论】:

      【解决方案8】:

      使用Object.keys()...这是正确的方法。

      完整文档可在以下链接的 MDN 网站上找到:

      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

      【讨论】:

        【解决方案9】:

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

        k for k of obj
        

        因此

        (1 for _ of obj).length
        

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            【解决方案11】:
            var obj = {
               key1: 'value1',
               key2: 'value2',
               key3: 'value3',
               key4: 'value4'
            }
            
            console.log(Object.keys(obj));
            console.log(Object.keys(obj).length)
            

            【讨论】:

              【解决方案12】:

              如果你决定使用 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);
              

              【讨论】:

                【解决方案13】:

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

                用于从 Object 中以数组的形式获取值: Object.values(obj) // obj 是您使用的对象名称 结果 -> [“value1”、“value2”、“value3”、“value4”]

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

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

                【讨论】:

                  【解决方案14】:

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

                  【讨论】:

                    【解决方案15】:

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

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

                    上面sn-p的简写就是,只需要一个参数

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

                    【讨论】:

                      【解决方案16】:
                             if(props.userType){
                                var data = []
                                Object.keys(props.userType).map(i=>{
                                      data.push(props.userType[i])
                                })
                                setService(data)
                              }
                      

                      【讨论】:

                        【解决方案17】:

                        现代浏览器确实支持:

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

                        【讨论】:

                          【解决方案18】:

                          使用切片、应用和连接方法。

                          var print = Array.prototype.slice.apply( obj );
                          alert('length='+print.length+' list'+print.join());
                          

                          【讨论】:

                            猜你喜欢
                            • 2017-03-13
                            • 2017-12-17
                            • 2018-12-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2021-06-16
                            • 2014-02-27
                            • 2019-12-04
                            相关资源
                            最近更新 更多