2016-05-23 150 views
1

我有一個對象數組,我想轉換成其他對象。什麼是在JavaScript中做到這一點的最佳方式?

var input = [ 
    { "type": "Pant", "brand": "A", "subBrand":"P", "size": "10"}, 
    {"type": "Pant", "brand": "A", "subBrand":"P", "size": "12"}, 
    {"type": "Pant", "brand": "A", "subBrand":"Q", "size": "12"}, 
    {"type": "Pant", "brand": "B", "subBrand":"P", "size": "10"}, 
    {"type": "Shirt", "brand": "A", "subBrand":"P", "size": "10"} 
]; 

輸出應該在這個格式:

output = { 
    "Pant" : { 
     "A" : { 
      "P" : { 
      "size" : [10,12] 
      }, 
      "Q" : { 
      "size" : [12] 
      } 
     } 
     "B" : { 
      "P" : { 
      "size" : [10] 
      } 
     } 
    }, 
    "Shirt" : { 
     "A" : { 
      "P" : { 
      "size" : [10] 
      } 
     } 
    } 
}; 

我試着寫代碼和它變得非常複雜,每次檢查每一件事情的是否提前或不來。 請指教。

回答

3

您可以使用Array#forEach並使用默認的空對象構建所需的對象。

var input = [{ "type": "Pant", "brand": "A", "subBrand": "P", "size": "10" }, { "type": "Pant", "brand": "A", "subBrand": "P", "size": "12" }, { "type": "Pant", "brand": "A", "subBrand": "Q", "size": "12" }, { "type": "Pant", "brand": "B", "subBrand": "P", "size": "10" }, { "type": "Shirt", "brand": "A", "subBrand": "P", "size": "10" }], 
 
    output = {}; 
 

 
input.forEach(function (a) { 
 
    output[a.type] = output[a.type] || {}; 
 
    output[a.type][a.brand] = output[a.type][a.brand] || {}; 
 
    output[a.type][a.brand][a.subBrand] = output[a.type][a.brand][a.subBrand] || { size: [] }; 
 
    output[a.type][a.brand][a.subBrand].size.push(a.size); 
 
}); 
 

 
console.log(output);

如果你喜歡它有點整潔(和ES6),那麼你可以遍歷用於減少和建立對象的對象鍵。

var input = [{ "type": "Pant", "brand": "A", "subBrand": "P", "size": "10" }, { "type": "Pant", "brand": "A", "subBrand": "P", "size": "12" }, { "type": "Pant", "brand": "A", "subBrand": "Q", "size": "12" }, { "type": "Pant", "brand": "B", "subBrand": "P", "size": "10" }, { "type": "Shirt", "brand": "A", "subBrand": "P", "size": "10" }], 
 
    output = {}; 
 

 
input.forEach(function (a) { 
 
    var o = ['type', 'brand', 'subBrand'].reduce((r, k) => r[a[k]] = r[a[k]] || {}, output); 
 
    o.size = o.size || []; 
 
    o.size.push(a.size); 
 
}); 
 

 
console.log(output);

+1

非常感謝,減少是真棒! – ajayv

+0

@ajayv,請看看這裏:http://stackoverflow.com/help/someone-answers –

0

您可以使用.reduce

input.reduce((res,x)=>{ 
res[x.type] = res[x.type] || {}; 
res[x.type][x.brand] = res[x.type][x.brand] || {} 
res[x.type][x.brand][x.subBrand]= res[x.type][x.brand][x.subBrand] || {size:[]} 
res[x.type][x.brand][x.subBrand].size.push(x.size) 
return res; 
},{}) 
相關問題