javascript中关联键和数字的数组组合

javascript中关联键和数字的数组组合,javascript,jquery,arrays,json,multidimensional-array,Javascript,Jquery,Arrays,Json,Multidimensional Array,简言之,我要开始我的问题 我只是读取json文件 [{"FirstCategory":"Bath","SecondCategory":"Bath Accessories","ThirdCategory":""}, {"FirstCategory":"Bath","SecondCategory":"Faucets","ThirdCategory":""},{"FirstCategory":"Bath","SecondCategory":"Fixtures","ThirdCategory":""}

简言之,我要开始我的问题

我只是读取json文件

 [{"FirstCategory":"Bath","SecondCategory":"Bath Accessories","ThirdCategory":""}, {"FirstCategory":"Bath","SecondCategory":"Faucets","ThirdCategory":""},{"FirstCategory":"Bath","SecondCategory":"Fixtures","ThirdCategory":""},{"FirstCategory":"Bath","SecondCategory":"Vanities","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Concrete","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Fencing","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Gypsum","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Insulation","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Insulssdation","ThirdCategory":""}]
并尝试转换为类似数组的

Array
(
  [Bath] => Array
    (
        [Bath Accessories] => Array
            (
                [0] => test
            )

        [Faucets] => Array
            (
                [0] => test1
                [1] => test2
            )

    )

)//sorry i have used PHP for simple formatting the array.
我花了很多时间在这件事上我不能成功请帮帮我

 My javascript code : (not working.)

 var FirstCategory = [];
 var SecondCategory = [];
 var ThirdCategory = [];


 $.getJSON('tree.json', function(data) {

var dataObj = new Array();
$.each(data,function(i){
    dataObj[data[i].FirstCategory] = new Array();

    if([data[i].SecondCategory] in dataObj[data[i].FirstCategory])
        dataObj[data[i].FirstCategory][data[i].SecondCategory] = data[i].SecondCategory;
    else
        dataObj[data[i].FirstCategory][data[i].SecondCategory] = new Array();

    dataObj[data[i].FirstCategory][data[i].SecondCategory][data[i].ThirdCategory] = new Array();

});

 console.log(dataObj);

/*
$.each(data,function(i){

    if (FirstCategory == '') {
        FirstCategory.push(data[i].FirstCategory);
    }
    else
    {
        if(!FirstCategory.contains(data[i].FirstCategory))
        {
            //root
            FirstCategory.push(data[i].FirstCategory);
        }
        else
        {
            //------- second level category -------//
            if (SecondCategory == '') {
                SecondCategory.push(data[i].SecondCategory);
            }
            else
            {
                if(!SecondCategory.contains(data[i].SecondCategory))
                {
                    SecondCategory.push(data[i].SecondCategory);
                }
                else
                {
                    ThirdCategory.push(data[i].ThirdCategory);
                }
            }

        }
    }   

});
*/

});


Array.prototype.contains = function(obj) {
  var i = this.length;
  while (i--) {
        if (this[i] == obj) {
         return true;
      }
  }
   return false;
}
提前谢谢。

请注意

从编程的角度来说:

var levels = ["FirstCategory", "SecondCategory", "ThirdCategory"]; // possibly more
var dataObj = {}; // an empty object
for (var i=0; i<data.length; i++) {
    var cur = dataObj;
    for (var j=0; j<levels.length; j++) {
        var key = data[i][levels[j]];
        if (!key) // empty
            break;
        if (key in cur)
            cur = cur[key];
        else
            cur = cur[key] = {};
    }
}
请告诉我

从编程的角度来说:

var levels = ["FirstCategory", "SecondCategory", "ThirdCategory"]; // possibly more
var dataObj = {}; // an empty object
for (var i=0; i<data.length; i++) {
    var cur = dataObj;
    for (var j=0; j<levels.length; j++) {
        var key = data[i][levels[j]];
        if (!key) // empty
            break;
        if (key in cur)
            cur = cur[key];
        else
            cur = cur[key] = {};
    }
}

这可能会起作用:

input = [{"FirstCategory":"Bath","SecondCategory":"Bath     Accessories","ThirdCategory":""}, {"FirstCategory":"Bath","SecondCategory":"Faucets","ThirdCategory":""},{"FirstCategory":"Bath","SecondCategory":"Fixtures","ThirdCategory":""},{"FirstCategory":"Bath","SecondCategory":"Vanities","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Concrete","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Fencing","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Gypsum","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Insulation","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Insulssdation","ThirdCategory":""}];

function reducer (prev, val) {
    v1 = val["FirstCategory"]
    v2 = val["SecondCategory"]
    if (!(v1 in prev)) { prev[v1] = {}; }
    if (!(v2 in prev[v1])) { prev[v1][v2] = [];}
    prev[v1][v2].push(val["ThirdCategory"]);
    return prev;
}

output = input.reduce(reducer, {});

console.log(input);
console.log(output);
输出:

{ Bath: 
   { 'Bath Accessories': [ '' ],
     Faucets: [ '' ],
     Fixtures: [ '' ],
     Vanities: [ '' ] },
  'Building Materials': 
   { Concrete: [ '' ],
     Fencing: [ '' ],
     Gypsum: [ '' ],
     Insulation: [ '' ],
     Insulssdation: [ '' ] } }

这可能会起作用:

input = [{"FirstCategory":"Bath","SecondCategory":"Bath     Accessories","ThirdCategory":""}, {"FirstCategory":"Bath","SecondCategory":"Faucets","ThirdCategory":""},{"FirstCategory":"Bath","SecondCategory":"Fixtures","ThirdCategory":""},{"FirstCategory":"Bath","SecondCategory":"Vanities","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Concrete","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Fencing","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Gypsum","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Insulation","ThirdCategory":""},{"FirstCategory":"Building Materials","SecondCategory":"Insulssdation","ThirdCategory":""}];

function reducer (prev, val) {
    v1 = val["FirstCategory"]
    v2 = val["SecondCategory"]
    if (!(v1 in prev)) { prev[v1] = {}; }
    if (!(v2 in prev[v1])) { prev[v1][v2] = [];}
    prev[v1][v2].push(val["ThirdCategory"]);
    return prev;
}

output = input.reduce(reducer, {});

console.log(input);
console.log(output);
输出:

{ Bath: 
   { 'Bath Accessories': [ '' ],
     Faucets: [ '' ],
     Fixtures: [ '' ],
     Vanities: [ '' ] },
  'Building Materials': 
   { Concrete: [ '' ],
     Fencing: [ '' ],
     Gypsum: [ '' ],
     Insulation: [ '' ],
     Insulssdation: [ '' ] } }
试试这个:

var formattedData = {};
$.each(data, function(i, item) {
    if(!formattedData[item.FirstCategory]) {
        formattedData[item.FirstCategory] = {};
    }
    if(!formattedData[item.FirstCategory][item.SecondCategory]) {
        formattedData[item.FirstCategory][item.SecondCategory] = [];
    }
    formattedData[item.FirstCategory][item.SecondCategory].push(item.ThirdCategory);
});
生成的对象将具有以下结构:

var formattedData = {
    'Bath': {
        'Bath Accessories': [
            'Non-slip Bath Mat'
        ],
        'Faucets': [
            'Brass Fawcet (Pair)',
            'Chrome Fawcet (Pair)',
            'Gold Fawcet (Monoblock)'
        ],
        'Fixtures': [
            'xxx',
            'yyy',
            'zzz'
        ],
        //etc.
        //etc.
    }
};

试试这个:

var formattedData = {};
$.each(data, function(i, item) {
    if(!formattedData[item.FirstCategory]) {
        formattedData[item.FirstCategory] = {};
    }
    if(!formattedData[item.FirstCategory][item.SecondCategory]) {
        formattedData[item.FirstCategory][item.SecondCategory] = [];
    }
    formattedData[item.FirstCategory][item.SecondCategory].push(item.ThirdCategory);
});
生成的对象将具有以下结构:

var formattedData = {
    'Bath': {
        'Bath Accessories': [
            'Non-slip Bath Mat'
        ],
        'Faucets': [
            'Brass Fawcet (Pair)',
            'Chrome Fawcet (Pair)',
            'Gold Fawcet (Monoblock)'
        ],
        'Fixtures': [
            'xxx',
            'yyy',
            'zzz'
        ],
        //etc.
        //etc.
    }
};

您的json不在该表单上有什么原因吗?如果不是的话,我建议改为更改后端。首先你应该意识到,在JavaScript中,你所做的是一个普通对象,而不是数组。你从哪里得到这些
test
test1
test2
值的?你的json不在表单上有什么原因吗?如果不是,我建议改为更改后端。首先,你应该意识到在JavaScript中,你所做的是一个普通对象,而不是数组。你从哪里得到这些
test
test1
test2
值的?非常好的解决方案。。。。但是要小心
Array.reduce()
是对ECMAScript 5的添加。最新的Chrome、FF、Opera、Safari和IE9都可以,但IE6/7/8需要解决方案脚本。阅读所有关于它的@RudolfMühlbauer:Thanxs dude:)非常好的解决方案。。。。但是要小心
Array.reduce()
是对ECMAScript 5的添加。最新的Chrome、FF、Opera、Safari和IE9都可以,但IE6/7/8需要解决方案脚本。阅读所有关于它的内容@RudolfMühlbauer:Thanxs dude:)