0

简而言之,我开始了我的问题,

我只是读取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;
}

提前致谢。

4

3 回答 3

2

请注意Javascript 没有“关联数组”

更以编程方式:

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] = {};
    }
}

示例输入的结果 ( dataObj),格式为 JSON:

{
    "Bath": {
        "Bath Accessories": {},
        "Faucets": {},
        "Fixtures": {},
        "Vanities": {}
    },
    "Building Materials": {
        "Concrete": {},
        "Fencing": {},
        "Gypsum": {},
        "Insulation": {},
        "Insulssdation": {}
    }
}
于 2012-11-02T13:38:59.363 回答
2

这可能会奏效:

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: [ '' ] } }
于 2012-11-02T13:55:00.963 回答
1

试试这个 :

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

演示

于 2012-11-02T14:34:52.613 回答