【问题标题】:Javascript Array conversion [duplicate]Javascript数组转换[重复]
【发布时间】:2013-04-25 17:07:34
【问题描述】:

我想知道我怎么能把它变成这样:

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}
               }
       }

【问题讨论】:

  • 可以,您只需筛选数据并自己创建对象。我会让你成为一个小提琴。
  • 问题 - 您的输入和输出对象是已经在内存中的对象,还是只是文本?如果它们是对象,您可以使用循环遍历对象,以根据需要重新格式化。
  • @Sebastien Renauld 如果是字符串,他可以用parse()把它变成一个对象
  • 看起来不像是字符串。他的例子使用了一个数组字面量。
  • 抱歉,我是在回答塞巴斯蒂安的问题。

标签: javascript jquery arrays


【解决方案1】:

这比您想象的要容易。试试这个:

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);
}

【讨论】:

  • 做得很好,比我的实现更快更好。
【解决方案2】:

这个简单的 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;
}

但首先使用嵌套模式看起来更容易?

【讨论】:

  • 您的解决方案没有提供正确的结果,它只返回银数。
  • @Jlange:如果你在控制台中执行这个,你当然需要添加一个显式的return JSON.stringify(new_data, null, 4)(否则它只会打印8,即最后一个id)
  • 不,我在小提琴中运行它,它没有返回正确的数据结构
  • @Jlange: Better?
【解决方案3】:

你可以像这样使用.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;
}, {});

【讨论】:

    猜你喜欢
    • 2018-08-06
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 2016-08-15
    • 2015-08-04
    • 2014-05-20
    • 2018-05-19
    • 2019-04-10
    相关资源
    最近更新 更多