【问题标题】:Split json object by name按名称拆分 json 对象
【发布时间】:2016-06-02 12:08:25
【问题描述】:

我正在寻找按名称拆分 json 对象的最聪明的方法,但我还没有找到正确的答案。

json 看起来像这样:

[{
    "Date": "2016-02-17",
    "ProductionAvg": 0.014558
}, {
    "Date": "2016-02-18",
    "ProductionAvg": 0.014154
}]

我需要将对象拆分为仅包含每对值的数组:

[2016-02-17, 2016-02-18]

[0.014558, 0.014154]

到目前为止我想出的代码是:

var date = []
var production = []

$.each(data, function () {
    $.each(this, function (name, value) {
        if (name == "Date") {
          date.push(value);
        }
        if (name == "ProductionAvg") {
          production.push(value);
        }
      }
    });
});

但是,作为我的新手,我完全不确定这是否是实现此目标的标准方法。非常感谢任何 cmets。

【问题讨论】:

    标签: jquery json each


    【解决方案1】:

    只要你知道所有的属性名称,你所拥有的并没有什么问题。

    如果你想让它更整洁、更动态,你可以将所有结果存储在另一个对象中,每个属性与源属性同名,值是从该源提取的值,例如

    {
        "Date": ["2016-02-17", "2016-02-18"],
        "ProductionAvg": [0.014558, 0.014154]
    }
    

    这只需要检查结果对象中是否存在属性,如果不存在,则将其设置为空数组。然后将当前值推送给它:

    var arr = [{
      "Date": "2016-02-17",
      "ProductionAvg": 0.014558
    }, {
      "Date": "2016-02-18",
      "ProductionAvg": 0.014154
    }]
    
    results = {};
    $.each(arr, function() { // loop array
      $.each(this, function(k, v) { // loop object
        // if result does not have property name, create it with empty array
        if(typeof(results[k]) === "undefined") {
          results[k] = [];
        }
        
        // push the value to the result array
        results[k].push(v);
      })
    });
    
    console.dir(results);
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

    【讨论】:

      【解决方案2】:

      您可以使用高阶函数 map 从数组创建新数组。

      如果您将 json 保存到变量 arr 中,您可以这样做:

      var dates = arr.map(x=>{
         return x.Date;
      });
      
      var production = arr.map(x=>{
         return x.ProductionAvg;
      });
      

      【讨论】:

      • 很好的答案,大家,非常感谢您的快速回复。我采用了这个解决方案,但都比我最初的好。我很想接受所有,但这是不可行的,但是,我赞成所有。
      【解决方案3】:

      使用hasOwnProperty 是一种更好的方法。此外,通过使嵌套的$.each 不是必需的,您会妨碍应用程序的性能。

      请查找代码here

      代码:

      var data = [{
          "Date": "2016-02-17",
          "ProductionAvg": 0.014558
      }, {
          "Date": "2016-02-18",
          "ProductionAvg": 0.014154
      }];
      var date = []
      var production = []
      
      $.each(data, function (key, value) {
          if (value.hasOwnProperty('Date')) {
              date.push(value.Date);
          }
          if (value.hasOwnProperty('ProductionAvg')) {
              production.push(value.ProductionAvg);
          }
      });
      
      document.write('date = ' + date + ', Production = ' + production);
      console.log(date, production);
      

      【讨论】:

        【解决方案4】:

        当您正在寻找最聪明的方法时,请使用纯 javascript。

        var arr = [{
            "Date": "2016-02-17",
            "ProductionAvg": 0.014558
        }, {
            "Date": "2016-02-18",
            "ProductionAvg": 0.014154
        }];
        
        function groups(arr) {
            var obj = {};
            arr.forEach(function(val) {
                var keys = Object.keys(val);
                keys.forEach(function(v) {
                    if (obj[v]) {
                        return obj[v].push(val[v]);
                    } 
                    obj[v] = [val[v]];
                });
            });
        
            return obj;
        }
        
        console.log(groups(arr))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-27
          • 2014-10-03
          • 1970-01-01
          • 2020-12-28
          • 2013-01-19
          • 1970-01-01
          • 1970-01-01
          • 2019-07-19
          相关资源
          最近更新 更多