如何使用阵列分割JSON对象为单独的对象

问题描述:

我有JSON在下面的格式:如何使用阵列分割JSON对象为单独的对象

{ 
    "line_items": [ 
     { 
      "rate": ["10", "20"], 
      "description": ["desc 1", "desc 2"], 
      "name": ["name 1", "name 2"] 
     } 
    ] 
} 

元件的阵列中的数量可以变化,但是每个元件的阵列将始终是相同的大小作为彼此。我通过将对象拆分为多个对象来移除数组。

这样的:

{ 
    "line_items": [ 
     { 
      "rate": "10", 
      "description": "desc 1", 
      "name": "name 1" 
     }, 
     { 
      "rate": "20", 
      "description": "desc 2", 
      "name": "name 2" 
     } 
    ] 
} 

我需要用JavaScript来做到这一点。

有没有一个功能可以为我做到这一点?我想我可能不得不使用foreach循环,但不知道如何处理它。

+1

*如果你的意思是否有一个内置的功能“是否有可能为我做这样的功能?” *。 –

+0

使用a为每个获取所有属性,然后为任何一个属性迭代以创建数组的对象 –

var obj = { 
 
    "line_items": [ 
 
     { 
 
      "rate": ["10", "20"], 
 
      "description": ["desc 1", "desc 2"], 
 
      "name": ["name 1", "name 2"] 
 
     } 
 
    ] 
 
} 
 

 
var props = []; 
 
for (var key in obj.line_items[0]) { 
 
    props.push(key); 
 
} 
 

 
var arrD = []; 
 

 
obj.line_items[0].rate.forEach(function(ele,ind){ 
 
var temp = {}; 
 
props.forEach(function(innerEle){ 
 
    temp[innerEle] = obj.line_items[0][innerEle][ind]; 
 
}); 
 
arrD.push(temp); 
 
}); 
 
var obj = {"line_items" : arrD} 
 
console.log(obj);

obj.line_items[0].rate.forEach(function(ele,ind){ 
    var temp = {}; 
    props.forEach(function(innerEle){ 
    temp[innerEle] = obj.line_items[0][innerEle][ind]; 
    }); 
    arrD.push(temp); 
}); 

这应该工作

function itemExpander(json) { 
    var result = {line_items: []}; 
    var item = json.line_items[0] 

    for (var i = 0; i < item.rate.length; i++) { 
    result.line_items.push({ 
     rate: item.rate[i], 
     description: item.description[i], 
     name: item.name[i], 
    }) 
    } 

    return result; 
} 

使用它

var obj = { 
 
    "line_items": [ 
 
     { 
 
      "rate": ["10", "20"], 
 
      "description": ["desc 1", "desc 2"], 
 
      "name": ["name 1", "name 2"] 
 
     } 
 
    ] 
 
}; 
 

 
length = obj.line_items[0].rate.length; 
 

 
newObject ={}; 
 
var limits = []; 
 

 
for(var i=0; i < length ; i++){ 
 
      newObject["rate"] = obj.line_items[0].rate[i]; 
 
      newObject["description"]= obj.line_items[0].description[i]; 
 
      newObject["name"]=obj.line_items[0].name[i]; 
 
      limits.push(newObject); 
 
      newObject ={} 
 
    } 
 

 
var lastObject = {"line_items":limits}; 
 
console.log(lastObject);

递归就地方法:

var object = { 
    "line_items": [ 
     { 
      "rate": ["10", "20"], 
      "description": ["desc 1", "desc 2"], 
      "name": ["name 1", "name 2"] 
     } 
    ] 
}; 

function oneIntoMany(list) { 
    var obj = list[0]; 
    var tmp_obj = {}; 
    var again = true; 
    for(var prop in obj){ 
     if(obj.hasOwnProperty(prop)){ 
      if(obj[prop].length > 1){ 
       tmp_obj[prop] = obj[prop].pop(); 
      }else{ 
       obj[prop] = obj[prop][0]; 
       again = false; 
      } 
     } 
    } 
    if(again){ 
     list.push(tmp_obj); 
     oneIntoMany(list); 
    } 
} 

oneIntoMany(object.line_items); 
console.log(object); 

这里是一个可行的解决方案。希望能帮助到你!

var obj = { 
 
    "line_items": [ 
 
     { 
 
      "rate": ["10", "20"], 
 
      "description": ["desc 1", "desc 2"], 
 
      "name": ["name 1", "name 2"] 
 
     } 
 
    ] 
 
} 
 

 
var arr1 = []; 
 
var arr2 = []; 
 
var arr3 = []; 
 
var result = {line_items: []}; 
 

 
for(var i in obj){ 
 
    for(var j in obj[i]){ 
 
    var myObject = obj[i]; 
 
    if(myObject[j].hasOwnProperty("rate") && myObject[j].hasOwnProperty("description") && myObject[j].hasOwnProperty("name")){ 
 
    arr1 = myObject[j]["rate"]; 
 
    arr2 = myObject[j]["description"]; 
 
    arr3 = myObject[j]["name"]; 
 
    } 
 
    } 
 
} 
 

 
for(var k = 0; k < 2; k++){ 
 
     result.line_items.push({ 
 
     rate: arr1[k], 
 
     description: arr2[k], 
 
     name: arr3[k] 
 
    }) 
 
} 
 
console.log(result);

var data = { 
     "rate": ["10", "20"], 
     "description": ["desc 1", "desc 2"], 
     "name": ["name 1", "name 2"] 
     } 


    function lengthChecker(items){ 
     for(var i in items){ 
      return items[i].length; 
     } 
    } 

    function processFunc(items){ 
     var keys = Object.keys(items); 
     var arr = []; 
     var length = lengthChecker(items) 
     for(let i=0 ; i < length ; i++){ 
      let cell = {}; 
      for(var j in keys){ 
       let targetKeyName = keys[j]; 
       cell[targetKeyName] = items[targetKeyName][i]; 
      } 
      arr.push(cell); 
     } 

     return arr; 
    } 

    var processData = processFunc(data) 
    console.log('processData',processData) 

你可以遍历所有属性和数组,并建立与单一属性的新阵列。

var data = { line_items: [{ rate: ["10", "20"], description: ["desc 1", "desc 2"], name: ["name 1", "name 2"] }] }, 
 
    result = { line_items: [] }; 
 

 
data.line_items.forEach(function (o) { 
 
    Object.keys(o).forEach(function (k) { 
 
     o[k].forEach(function (a, i) { 
 
      result.line_items[i] = result.line_items[i] || {}; 
 
      result.line_items[i][k] = a; 
 
     }); 
 
    }); 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

版本与line_items多个项目。

var data = { line_items: [{ rate: ["10", "20"], description: ["desc 1", "desc 2"], name: ["name 1", "name 2"] }, { rate: ["30", "40"], description: ["desc 3", "desc 4"], name: ["name 3", "name 4"] }] }, 
 
    result = { line_items: [] }; 
 

 
data.line_items.forEach(function (o) { 
 
    Object.keys(o).forEach(function (k) { 
 
     o[k].forEach(function (a, i) { 
 
      result.line_items[this.count + i] = result.line_items[this.count + i] || {}; 
 
      result.line_items[this.count + i][k] = a; 
 
     }, this); 
 
     this.max = Math.max(this.max, o[k].length); 
 
    }, this); 
 
    this.count += this.max; 
 
    this.max = 0; 
 
}, { count: 0, max: 0 }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

插入变量的问题你的对象在下面的代码等等看。 line_items对象可以包含多个元素。不,你必须写自己:

var question={ 
    "line_items": [ 
     { 
      "rate": ["10", "20","30"], 
      "description": ["desc 1", "desc 2","desc 3"], 
      "name": ["name 1", "name 2" ,"desc 3"] 
     } 
    ] 
}; 
var answer={"line_items":[]}; 
for(var i=0;i<question['line_items'].length;i++){ 
    for(var j=0;j<question['line_items'][i]['rate'].length;j++){ 
     var newObject={}; 
     newObject['rate']=question['line_items'][i]['rate'][j]; 
     newObject['description']=question['line_items'][i]['description'][j]; 
     newObject['name']=question['line_items'][i]['name'][j]; 
     answer["line_items"].push(newObject); 
    } 
}