2017-08-24 70 views
3

JSON格式我管理一个XML转换成JSON格式,但现在我需要操纵数据,以便我可以用特定的所需格式操纵与JavaScript

这里结束了为原来的形式

{ 
    "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": "" 
     } 
    } 
} 

这里是需要的形式

{ 
    "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": [[""]] 
    } 
} 

通知的row_n在原来的形式,我需要的是:

  • 为具有2个或更多的行作为父具有2D阵列
  • 的用于具有增量名称为具有堆叠在1个阵列

对于它们的值的每个属性的阵列的每个属性第二点,我设法使之成为这样

var object = { 
 
      "D_1": "orange", 
 
      "D_2": "banana", 
 
      "D_3": "apple", 
 
      "E_1": "46", 
 
      "E_2": "18", 
 
      "E_3": "1", 
 
     }; 
 
    
 
Object.keys(object).forEach(function (k) { 
 
    var parts = k.split(/_(?=\d+$)/); 
 
    if (parts.length === 2) { 
 
     object[parts[0]] = object[parts[0]] || []; 
 
     object[parts[0]][parts[1] - 1] = object[k]; // subtract one for zero based array 
 
     delete object[k]; 
 
    } 
 
}); 
 
console.log(object);

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

在此先感谢

注: 的名称和对象的大小已经为这个例子的目的

+0

因此,行总是有钥匙row_n,或将这种变化藏汉? –

+0

行总是要row_n @ManuelOtto – Jonathan

回答

-1

另一种方式jQuery的。

// 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)

+0

为什么要投票? – felixmosh

+0

嗨,我测试过,有一个问题,当一个属性有2个或更多部分组成的单词(例如:Ab_cd_e) – Jonathan

+0

是的,有代码分裂,并假设你有** row_n **,你可以尝试修改我的代码以满足您的需求。 – felixmosh

-1

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

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()

JSFiddle

+0

使用'$ .isArray()'而不是'Array.isArray()'和删除jquery的任何原因? – lascort

+0

@lascort向后兼容。他标记了jquery ... –

+0

我不想让“行”出现 – Jonathan