2013-04-25 96 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; 
}, {});