Javascript数组转换

Javascript数组转换,javascript,jquery,arrays,Javascript,Jquery,Arrays,我想知道如何才能扭转这种局面: 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:

我想知道如何才能扭转这种局面:

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

这个简单的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;
}
var数据=[…];
var new_data={};

对于(var i=0;i,此普通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;
}
var数据=[…];
var new_data={};

对于(var i=0;i,这比您想象的要容易。请尝试以下方法:

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);
}
函数助手(对象、树、值){

对于(var i=0,l=tree.length;i,这比您想象的要简单。请尝试以下方法:

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);
}
函数助手(对象、树、值){
对于(var i=0,l=tree.length;i您可以像这样使用
.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;
}, {});

或者像这样:

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;
}, {});
var new_data=data.reduce(函数(res,obj){
var o=res;
对于(变量i=1;i<3;i++)
o=(o[obj[“选项”+i]]=o[obj[“选项”+i]]]|{};
o[obj.option3]=obj.id;
返回res;
}, {});
您可以像这样使用
.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;
}, {});

或者像这样:

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;
}, {});
var new_data=data.reduce(函数(res,obj){
var o=res;
对于(变量i=1;i<3;i++)
o=(o[obj[“选项”+i]]=o[obj[“选项”+i]]]|{};
o[obj.option3]=obj.id;
返回res;
}, {});


你可以,你只需要筛选数据并自己创建对象。我会让你成为一个提琴手。问题-你的输入和输出对象是已经在内存中的,还是仅仅是文本?如果它们是对象,你可以使用循环遍历对象,并根据你的需要重新格式化。@Sebastien Renauld如果是字符串,他可以使用
parse()
将其转换为对象看起来不像是字符串。他的示例使用数组文字。对不起,我是在回答sebastien的问题。你可以,你只需筛选数据并自己创建对象。我会让你成为一个提琴。问题-你的输入和输出对象是已经在内存中的对象,还是仅仅是文本?如果不是“嘿,是对象,您可以使用循环遍历对象,以便根据需要重新格式化。@Sebastien Renauld如果是字符串,他可以使用
parse()
将其转换为对象看起来不像是字符串。他的示例使用数组文字。对不起,我是在回答sebastien的问题。您的解决方案没有提供正确的结果,它只返回银计数。@Jlange:如果您在控制台中执行此操作,则需要添加显式的
return JSON.stringify(新数据,空,4)
当然(否则只打印
8
,即最后一个id)不,我在我的小提琴里运行它,它没有返回正确的数据structure@Jlange:您的解决方案没有提供正确的结果,它只返回银计数。@Jlange:如果您在控制台中执行此操作,您需要添加一个显式的
return JSON.stringify(new_data,null,4)
当然(否则它将只打印
8
,即最后一个id)不,我在小提琴中运行了它,它不会返回正确的数据structure@Jlange:做得好,比我的实现更快更好。做得好,比我的实现更快更好。