我设法将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 ,我需要的是:
对于第二点,我设法以这种方式实现
{
"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": [[""]]
}
}
但是现在我正试图找到一种方法来实现考虑第二个功能的第一点。
提前致谢
备注: 对象的名称和大小已针对此示例目的进行了优化
答案 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()
答案 1 :(得分:-1)
另一种方式。
// 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;