使用javascript操纵JSON格式

时间:2017-08-24 14:31:31

标签: javascript jquery json object

我设法将XML转换为JSON格式,但现在我需要操纵数据,以便最终得到特定的所需格式

这是原始表格

g

这是所需的表格

{
    "machine": "Hassia2",
    "actual_product_date": "08/24/2017",
    "holding_tank_table": {
        "row_0": {
            "A": "Good Taste",
            "B": "Slight open",
            "C": "46",
        },
        "row_1": {
            "A": "Bad Taste",
            "B": "Grainy",
            "C": "125",
        }
    },
    "packed_product_table": {
        "row_0": {
            "D_1": "orange",
            "D_2": "banana",
            "D_3": "apple",
            "E_1": "46",
            "E_2": "18",
            "E_3": "1",
        },
        "row_1": {
            "D_1": "mango",
            "D_2": "litchy",
            "D_3": "pinneaple",
            "E_1": "52",
            "E_2": "63",
            "E_3": "1",
        }
    },
    "hr_qc_table": {
        "row_0": {
            "F": "",
            "G": ""
        }
    }
}

请注意原始表单中的 row_n ,我需要的是:

  • 对于具有2行或更多行作为父级的每个属性,以具有2D阵列数组
  • 为每个具有增量名称的属性使其值堆叠在1个数组

对于第二点,我设法以这种方式实现

{
    "machine": "Hassia2",
    "actual_product_date": "08/24/2017",
    "holding_tank_table": {
            "A": [["Good Taste"],["Bad Taste"]],
            "B":  [["Slight open"],["Grainy"]],
            "C": [["46"],["125"]]
    },
    "packed_product_table": {
            "D": [["orange","banana","apple"],["mango","litchy","pinneaple"]],
            "E":  [[46,18,1],[52,63,1]]
    },
    "hr_qc_table": {
            "F": [[""]],
            "G":  [[""]]
    }
}

但是现在我正试图找到一种方法来实现考虑第二个功能的第一点。

提前致谢

备注: 对象的名称和大小已针对此示例目的进行了优化

2 个答案:

答案 0 :(得分:-1)

这是一个艰难的。 我的方法是创建2个函数。第一个(convertRowsToArrays(obj))将行(row_0,row_1等)以及子行(D_1,D_2等)转换为数组。 第二个函数collapseArrays(obj)将返回的对象从第一个函数转换为所需的2D数组。

var json = '{"machine":"Hassia2","actual_product_date":"08/24/2017","holding_tank_table":{"row_0":{"A":"Good Taste","B":"Slight open","C":"46"},"row_1":{"A":"Bad Taste","B":"Grainy","C":"125"}},"packed_product_table":{"row_0":{"D_1":"orange","D_2":"banana","D_3":"apple","E_1":"46","E_2":"18","E_3":"1"},"row_1":{"D_1":"mango","D_2":"litchy","D_3":"pinneaple","E_1":"52","E_2":"63","E_3":"1"}},"hr_qc_table":{"row_0":{"F":"","G":""}}}'

var obj = JSON.parse(json)

function convertRowsToArrays(obj){
    var output = {}

    var keys = Object.keys(obj)

    var enumerations = {}

    for(var i=0;i<keys.length;i++){
        var parts = keys[i].split(/_(?=\d+$)/);
        if(parts.length==2){
            var key = parts[0]
            var num = parseInt(parts[1])
            if(!enumerations[key])
                enumerations[key] = []
            enumerations[key].push(num)

            keys.splice(i,1)
            i--
        }
    }

    for(var key in enumerations){
        var array = []
        for(var i=0;i<enumerations[key].length;i++){
            var val = obj[key+'_'+enumerations[key][i]]
            array.push(typeof val === 'object' ? convertRowsToArrays(val) : val)
        }
        output[key] = array
    }


    for(i=0;i<keys.length;i++){
        output[keys[i]] = typeof obj[keys[i]] === 'object' ? convertRowsToArrays(obj[keys[i]]) : obj[keys[i]]
    }

    return output
}

function collapseArrays(obj){
    var output = {}

    if($.isArray(obj)){
        var map = {}
        for(var i=0;i<obj.length;i++){
            for(var key in obj[i]){
                if(!map[key])
                    map[key] = []
                map[key].push(obj[i][key])
            }
        }
        output = map
    }else{
        for(var key in obj){
            output[key] = typeof obj[key] === 'object' ? collapseArrays(obj[key]) : obj[key]
        }
    }

    return output
}

var result = collapseArrays(convertRowsToArrays(obj))

console.log(JSON.stringify(result, null, 2));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

致电collapseArrays(convertRowsToArrays(obj))会给您带来理想的结果。

注意:这需要$.isArray()

的jquery

JSFiddle

答案 1 :(得分:-1)

另一种方式。

&#13;
&#13;
// small Object.keys pollyfill
if (!Object.keys) Object.keys = function(o) {
  if (o !== Object(o))
    throw new TypeError('Object.keys called on a non-object');
  var k = [],
    p;
  for (p in o)
    if (Object.prototype.hasOwnProperty.call(o, p)) k.push(p);
  return k;
}


var data = {
  "machine": "Hassia2",
  "actual_product_date": "08/24/2017",
  "holding_tank_table": {
    "row_0": {
      "A": "Good Taste",
      "B": "Slight open",
      "C": "46",
    },
    "row_1": {
      "A": "Bad Taste",
      "B": "Grainy",
      "C": "125",
    }
  },
  "packed_product_table": {
    "row_0": {
      "D_1": "orange",
      "D_2": "banana",
      "D_3": "apple",
      "E_1": "46",
      "E_2": "18",
      "E_3": "1",
    },
    "row_1": {
      "D_1": "mango",
      "D_2": "litchy",
      "D_3": "pinneaple",
      "E_1": "52",
      "E_2": "63",
      "E_3": "1",
    }
  },
  "hr_qc_table": {
    "row_0": {
      "F": "",
      "G": ""
    }
  }
};

var result = Object.keys(data).reduce((ret, key) => {
  if (typeof data[key] === 'object') {
    ret[key] = extractRows(data[key]);
  } else {
    ret[key] = data[key];
  }
  return ret;
}, {});

function extractRows(rows) {
  return Object.keys(rows).reduce((ret, key) => {
    const [_, num] = key.split('_');
    return expandRow(rows[key], ret, num);
  }, {});
}

function expandRow(row, initial, rowNum) {
  return Object.keys(row).reduce((ret, entryKey) => {
    const [key, _] = entryKey.split('_');
    if (ret[key]) {
      if (!ret[key][rowNum]) {
        ret[key][rowNum] = [];
      }
      ret[key][rowNum].push(row[entryKey]);

    } else {
      ret[key] = [
        [row[entryKey]]
      ];
    }
    return ret;
  }, initial)
}

console.log(result)
&#13;
&#13;
&#13;