【问题标题】:Make new array for json data为 json 数据创建新数组
【发布时间】:2016-03-28 11:27:52
【问题描述】:

我有如下 json 文件:

[
  {"TYPE": "A", "STATUS": "SUCCESS", "DISCOUNT": 500.00, "TOTAL": 5000.00},
  {"TYPE": "A", "STATUS": "SUCCESS", "DISCOUNT": 300.00, "TOTAL": 1266.00},
  {"TYPE": "A", "STATUS": "FAIL", "DISCOUNT": 300.00, "TOTAL": 515.00},
  {"TYPE": "B", "STATUS": "SUCCESS", "DISCOUNT": 323, "TOTAL": 846.00},
  {"TYPE": "B", "STATUS": "FAIL", "DISCOUNT": 80.00, "TOTAL": 3000.00},
  {"TYPE": "B", "STATUS": "KIV", "DISCOUNT": 105, "TOTAL": 900.00},
  {"TYPE": "C", "STATUS": "KIV", "DISCOUNT": 245.00, "TOTAL": 998.75},
  {"TYPE": "B", "STATUS": "SUCCESS", "DISCOUNT": 234.00, "TOTAL": 3500.00},
  {"TYPE": "C", "STATUS": "SUCCESS", "DISCOUNT": 201, "TOTAL": 5008.00},
  {"TYPE": "C", "STATUS": "FAIL", "DISCOUNT": 712, "TOTAL": 12300.00},
  {"TYPE": "A", "STATUS": "SUCCESS", "DISCOUNT": 500.00, "TOTAL": 5000.00},
  {"TYPE": "D", "STATUS": "SUCCESS", "DISCOUNT": 300.00, "TOTAL": 1266.00},
  {"TYPE": "D", "STATUS": "FAIL", "DISCOUNT": 300.00, "TOTAL": 515.00},
  {"TYPE": "D", "STATUS": "SUCCESS", "DISCOUNT": 323, "TOTAL": 846.00},
  {"TYPE": "B", "STATUS": "FAIL", "DISCOUNT": 80.00, "TOTAL": 3000.00},
  {"TYPE": "B", "STATUS": "KIV", "DISCOUNT": 105, "TOTAL": 900.00},
  {"TYPE": "C", "STATUS": "KIV", "DISCOUNT": 245.00, "TOTAL": 998.75},
  {"TYPE": "B", "STATUS": "SUCCESS", "DISCOUNT": 234.00, "TOTAL": 3500.00},
  {"TYPE": "C", "STATUS": "KIV", "DISCOUNT": 201, "TOTAL": 5008.00},
  {"TYPE": "C", "STATUS": "SUCCESS", "DISCOUNT": 712, "TOTAL": 12300.00} 
]

制作方法:

  1. 状态数组
  2. 总计数组(每个状态的总计)
  3. 每个状态的数组编号

示例(预期结果):

1) 状态 [“成功”、“失败”、“KIV”]

2) 总计 [199000.00, 12000.00, 6000.00]

3) 每种类型的每种状态的数量如:

[{A:[{SUCCESS: 2},
     {FAIL: 1}]
}, 
 {B:[{SUCCESS:2},
     {FAIL:1},
     {KIV:1}]
}]

我已经尝试过我自己的方式和它的作品(除了没有 3),但我想知道它是否可以是另一种更简单的方式。 下面是我的步骤:

      var arrStatus=[];
      var countStatus=[];
      var flagStatus="";

      var arrTotal=[];

      for (var i = 0; i < data.length; i++) {
          var tempStatus = data[i].STATUS;

          flagStatus= false;

          for(var z = 0; z< arrStatus.length; z++){
            if(tempStatus == arrStatus[z]){

              arrTotal[z] += data[i].TOTAL;
              countStatus[z]++;
              flagStatus = true;

            }
          }              

          if(flagStatus == false){
            countStatus.push(1);
            arrStatus.push(tempStatus);
            arrTotal.push(data[i].TOTAL);
          }
      }

感谢您的帮助

【问题讨论】:

  • 假设这是 c#,您可以利用 Newtonsoft.Json 库将 JSON 字符串解析为强类型 JObject。通过该对象,您可以操作数据以生成您希望的新 JObject。

标签: json


【解决方案1】:

这是一个算法。创建地图。键将是一个 STATUS 值。该值是一个类型为 JsonData(您创建的类)的对象,它有两个属性:计数和总计。遍历您的 json 数据。如果遇到新状态,请创建一个 JsonData 类型的新实例并相应地设置其值(例如,count = 1,total = 5000)。如果您遇到已经看到的状态,请将计数加 1,并将总数增加新的总数(例如,count++ 和总计 = 总计 + 1266 表示您第二次看到 SUCCESS 条目)。

【讨论】:

    【解决方案2】:

    不是最好的解决方案,但它有效!

    function getUnique(array, item) {
      var items = [];
      for (var i = 0, len = array.length; i < len; i++) {
        for (var key in array[i]) {
          if (key === item) {
            items.push(array[i][key]);
          }
        }
      }
      return eliminateDuplicates(items);
    }
    
    function eliminateDuplicates(arr) {
      var i,
        len = arr.length,
        out = [],
        obj = {};
    
      for (i = 0; i < len; i++) {
        obj[arr[i]] = 0;
      }
      for (i in obj) {
        out.push(i);
      }
      return out;
    }
    var uniqueStatus = getUnique(data, "STATUS");
    console.log(uniqueStatus);
    

    输出:[ 'SUCCESS', 'FAIL', 'KIV' ]

    function getTotal(array, item) {
      var sum = 0;
      for (var i = 0, len = array.length; i < len; i++) {
        for (var key in array[i]) {
          if (array[i][key] === item) {
            sum += array[i]["TOTAL"];
          }
        }
      }
      return sum;
    }
    var total = [getTotal(data, "SUCCESS"), getTotal(data, "FAIL"), getTotal(data, "KIV")];
    console.log(total);
    

    输出:[ 38532, 19330, 8805.5 ]

    var uniqueType = getUnique(data, "TYPE");
    console.log(uniqueType);
    

    输出:[ 'A', 'B', 'C', 'D' ]

    function makeObject(array, type, status) {
      var count = 0;
      for (var i = 0, len = array.length; i < len; i++) {
        if (array[i]["TYPE"] === type && array[i]["STATUS"] === status) {
          count++;
        }
      }
      return count;
    }
    
    console.log(makeObject(data, "B", "SUCCESS"));
    

    输出:3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多