2013-04-25 110 views
0

我想知道我怎麼可以把這樣的:JavaScript數組轉換

var data = [ 
    {id:1,option1:'short',option2:'red',option3:'gold'}, 
    {id:2,option1:'short',option2:'red',option3:'silver'}, 
    {id:3,option1:'short',option2:'blue',option3:'gold'}, 
    {id:4,option1:'short',option2:'blue',option3:'silver'}, 
    {id:5,option1:'long',option2:'red',option3:'gold'}, 
    {id:6,option1:'long',option2:'red',option3:'silver'}, 
    {id:7,option1:'long',option2:'blue',option3:'gold'}, 
    {id:8,option1:'long',option2:'blue',option3:'silver'}] 

成格式化像這樣使用jQuery的東西。

var new_data = { 
      short:{ 
       red:{gold:1,silver:2}, 
       blue:{gold:3,silver:4} 
      }, 
      long:{ 
       red:{gold:5,silver:6}, 
       blue:{gold:7,silver:8} 
       } 
     } 
+4

不使用jQuery,沒有。 – Bergi 2013-04-25 17:09:19

+0

你可以,你只需要篩選數據並自己創建對象。我會讓你成爲小提琴。 – Jlange 2013-04-25 17:10:41

+1

問題 - 你的輸入和輸出已經在內存中的東西對象,還是隻是文本?如果它們是對象,則可以使用循環遍歷該對象以根據需要重新格式化。 – 2013-04-25 17:10:53

回答

4

這比您想象的要容易。試試這個:

function helper(obj,tree,value) { 
    for(var i=0, l=tree.length; i<l-1; i++) { 
     obj[tree[i]] = obj[tree[i]] || {}; 
     obj = obj[tree[i]]; 
    } 
    obj[tree[i]] = value; 
} 
var new_data = {}, l = data.length, i; 
for(i=0; i<l; i++) { 
    helper(new_data,[data[i].option1,data[i].option2,data[i].option3],data[i].id); 
} 
+0

很好地完成,比我的實施更快,更好。 – Jlange 2013-04-25 17:17:52

1

這純JS將做到這一點:

var data = […]; 
var new_data = {}; 
for (var i=0; i<data.length; i++) { 
    var o = new_data; 
    for (var j=1; j<3; j++) { 
     var prop = data[i]["option"+j]; 
     o = o[prop] || (o[prop] = {}); 
    } 
    o[data[i]["option"+j]] = data[i].id; 
} 

但它看起來更容易使用嵌套模式擺在首位?

+0

您的解決方案不提供正確的結果,它只返回銀計數。 – Jlange 2013-04-25 17:16:07

+0

@Jlange:如果你在控制檯執行它,你當然需要添加一個顯式的'return JSON.stringify(new_data,null,4)'(否則它只會打印'8',也就是最後一個ID) – Bergi 2013-04-25 17:18:25

+0

不,我在我的小提琴中運行它,它不返回正確的數據結構 – Jlange 2013-04-25 17:20:21

1

您可以使用.reduce()這樣的:

var new_data = data.reduce(function(res, obj) { 
    if (!res[obj.option1]) 
     res[obj.option1] = {}; 
    if (!res[obj.option1][obj.option2]) 
     res[obj.option1][obj.option2] = {}; 

    res[obj.option1][obj.option2][obj.option3] = obj.id; 
    return res; 
}, {}); 

或像這樣:

var new_data = data.reduce(function(res, obj) { 
    var o = res; 
    for (var i = 1; i < 3; i++) 
     o = (o[obj["option" + i]] = o[obj["option" + i]] || {}); 

    o[obj.option3] = obj.id; 
    return res; 
}, {});