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

これでうまくいくかもしれません:

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 に答える
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] = {};
    }
}

dataObjJSON 形式の入力例の結果 ( ):

{
    "Bath": {
        "Bath Accessories": {},
        "Faucets": {},
        "Fixtures": {},
        "Vanities": {}
    },
    "Building Materials": {
        "Concrete": {},
        "Fencing": {},
        "Gypsum": {},
        "Insulation": {},
        "Insulssdation": {}
    }
}
于 2012-11-02T13:38:59.363 に答える
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 に答える