【问题标题】:Retrieving Keys from JSON Array key-value pair dynamically - Javascript从 JSON 数组键值对动态检索键 - Javascript
【发布时间】:2011-11-15 12:32:34
【问题描述】:

我有一个问题想请教您的专业知识。

这是我拥有的 JSON 数组:

[{"A":20,"B":32,"C":27,"D":30,"E":40}]

我想做的是从 JSON 数组而不是值中检索键(A、B、C、D、E)。我能够检索值,但不能检索键。

我正在使用它来动态检索值:

function calculateSum(jsonArray) {
    var result = 0;
    for (var i = jsonArray.length - 1;  i >= 0; --i)
    {
        var o = jsonArray[i];
        A = o.A;
        B = o.B;
        C = o.C;
        D = o.D;
        E = o.E;
        result = A + B + C + D + E;
        return result;
    }

    return result;
}

同样,我应该如何使用 JavaScript 检索 keys

【问题讨论】:

    标签: javascript json d3.js


    【解决方案1】:

    您是否使用D3.js 作为您的标签所暗示的?因为在这种情况下,你可以使用d3.keys()

    var data = [{"A":20,"B":32,"C":27,"D":30,"E":40}];
    d3.keys(data[0]); // ["A", "B", "C", "D", "E"] 
    

    如果您想要所有值的总和,最好使用d3.values()d3.sum()

    var data = [{"A":20,"B":32,"C":27,"D":30,"E":40}, {"F":50}];
    // get total of all object totals
    var total = d3.sum(data, function(d) {
        // get total of a single object's values
        return d3.sum(d3.values(d));
    });
    total; // 199
    

    【讨论】:

      【解决方案2】:

      所有当前发布的解决方案都有问题。在使用 for...in 循环迭代对象时,它们都没有检查object.hasOwnProperty(prop)。如果将属性添加到原型中,这可能会导致出现幻像键。

      引用Douglas Crockford

      请注意,添加到对象原型中的成员将包含在枚举中。通过使用 hasOwnProperty 方法来区分对象的真实成员来进行防御性编程是明智的。

      在 maerics 的出色解决方案中添加对 hasOwnProperty 的检查。

      var getKeys = function (arr) {
              var key, keys = [];
              for (i = 0; i < arr.length; i++) {
                  for (key in arr[i]) {
                      if (arr[i].hasOwnProperty(key)) {
                          keys.push(key);
                      }
                  }
              }
              return keys;
          };
      

      【讨论】:

      • +1 对于 JSON 反序列化的对象来说,这并不是一个真正的问题,但你是对的,代码通过检查更好。我会把它添加到我的答案中......
      【解决方案3】:

      使用for .. in:

      var result = 0;
      
      for (var i = jsonArray.length - 1; i >= 0; --i) {
          var o = jsonArray[i];
          for (var key in o) {
            if (o.hasOwnProperty(key)) {
              result += o[key];
            }
          }
          // in your code, you return result here, 
          // which might not give the right result 
          // if the array has more than 1 element
      }
      
      return result;
      

      【讨论】:

      • 这只是总结了这些值。我相信@Queryer 想要检索键列表。
      • @Sahil Muthoo:这不是我所理解的......对我来说,他想总结价值,但事先不知道关键......
      【解决方案4】:
      var easy = {
          a: 1,
          b: 2,
          c: 3
      }
      
      var keys = [], vals = []
      for (var key in easy) {
          keys.push(key)
          vals.push(easy[key])
      }
      
      alert(keys+" - tha's how easy baby, it's gonna be")
      alert(vals+" - tha's how easy baby, it's gonna be")
      

      防守

      包括@Sahil的防御方法……

      for (var key in easy) {
          if (easy.hasOwnProperty(key)) {
              keys.push(key)
              vals.push(easy[key])
          }
      }
      

      【讨论】:

        【解决方案5】:

        尝试使用JavaScript for..in statement

        var getKeys = function(arr) {
          var key, keys = [];
          for (i=0; i<arr.length; i++) {
            for (key in arr[i]) {
              keys.push(key);
            }
          }
          return keys;
        };
        
        var a = [{"A":20, "B":32, "C":27, "D":30, "E":40}, {"F":50}]
        getKeys(a); // => ["A", "B", "C", "D", "E", "F"]
        

        【讨论】:

          【解决方案6】:

          我认为这是最简单的。

          var a = [{"A":20,"B":32,"C":27,"D":30,"E":40}];
          Object.keys( a[0] );
          

          结果:

          ["A", "B", "C", "D", "E"]
          

          【讨论】:

          • 如果数组中有多个对象怎么办?
          【解决方案7】:

          for-in-loop 可以解决问题。在一个对象上看起来像这样:

          var o = {
              a: 5,
              b: 3
          };
          var num = 0;
          
          for (var key in o) {
              num += o[key];
          }
          alert(num);
          

          【讨论】:

          • 这只是总结了这些值。我相信@Queryer 想要检索键列表。
          【解决方案8】:

          试试这个。很简单:

          var a = [{"A":20,"B":32,"C":27,"D":30,"E":40}];
          
          for(var i in a){
            for(var j in a[i]){
              console.log(j); // shows key
              console.log(a[i][j]); // shows value
            }
          }
          

          【讨论】:

            【解决方案9】:

            我认为这应该像下面这样递归解析

            var getKeys = function(previousKeys,obj){
                    var currentKeys = Object.keys(obj);
                    previousKeys = previousKeys.concat(currentKeys);
                    for(var i=0;i<currentKeys.length;i++){
                        var innerObj = obj[currentKeys[i]];
                        if(innerObj!==null && typeof innerObj === 'object' && !Array.isArray(innerObj)){
                        return this.getKeys(previousKeys,innerObj);
                        }
                    }
                    return previousKeys;
                }
            

            用法:getKeys([],{"a":"1",n:{c:"3",e:{ f:4,g:[1,2,3]}}})

            结果: [“a”、“n”、“c”、“e”、“f”、“g”]

            【讨论】:

              【解决方案10】:
              var _ = require('underscore');
              
              var obj = [{"A":20,"B":32,"C":27,"D":30,"E":40},{"F":50}, {"G":60,"H":70},{"I":80}];
              
              var keys = [], values = [];
              
              
              
              _.each(obj, function(d) {
              
                   keys.push(_.keys(d));
              
                   values.push(_.values(d));
              });
              
              
              // Keys   ->  [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I' ]
              console.log('Keys   -> ', _.flatten(keys ));
              // Values ->  [ 20, 32, 27, 30, 40, 50, 60, 70, 80 ]
              console.log('Values -> ', _.flatten(values));
              

              【讨论】:

                【解决方案11】:

                停止重复造轮子

                Object.keys()
                

                MDN

                【讨论】:

                  猜你喜欢
                  • 2019-08-25
                  • 1970-01-01
                  • 2017-11-19
                  • 1970-01-01
                  • 2018-12-15
                  • 2012-06-10
                  • 2020-02-10
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多