0

以下は、データ配列内の私のデータです。以下のコードで私がやっていることは、その与えられたデータから、私も以下に与えた特別なフォーマットでjsonを構築しなければならないということです.

//code start here
   var hierarchy={};
    hierarchy.name="Hierarchy";
    hierarchy.children=[{"name":"","children":[{"name":"","children":[]}]}];
    var countryindex;
    var flagExist=false;
    var data = [
        {country :"America", city:"Kansas", employe:'Jacob'},
        {country :"Pakistan", city:"Lahore", employe:'tahir'},
        {country :"Pakistan", city:"Islamabad", employe:'fakhar'} ,
        {country :"Pakistan", city:"Lahore", employe:'bilal'},
        {country :"India", city:"d", employe:'ali'}  ,
        {country :"Pakistan", city:"Karachi", employe:'eden'},
        {country :"America", city:"Kansas", employe:'Jeen'}  ,
        {country :"India", city:"Banglore", employe:'PP'} ,
        {country :"India", city:"Banglore", employe:'JJ'}  ,

    ];


    for(var i=0;i<data.length;i++)
    {


        for(var j=0;j<hierarchy.children.length;j++)
        {
            //for checking country match
            if(hierarchy.children[j].name==data[i].country)
            {
                countryindex=j;
                flagExist=true;
                break;

            }

        }

        if(flagExist)//country match now no need to add new country just add city in it
        {
            var cityindex;
            var cityflag=false;
            //hierarchy.children[countryindex].children.push({"name":data[i].city,"children":[]})
            //if(hierarchy.children[index].children!=undefined)
            for(var k=0;k< hierarchy.children[countryindex].children.length;k++)
            {
                //for checking city match
                if(hierarchy.children[countryindex].children[k].name==data[i].city)
                {
                    // hierarchy.children[countryindex].children[k].children.push({"name":data[i].employe})
                    cityflag=true;
                    cityindex=k;
                    break;
                }

            }
            if(cityflag)//city match now add just empolye at that city index
            {
                hierarchy.children[countryindex].children[cityindex].children.push({"name":data[i].employe});

                cityflag=false;
            }
            else//no city match so add new with employe also as this is new city so its emplye will be 1st
            {
                hierarchy.children[countryindex].children.push({"name":data[i].city,children:[{"name":data[i].employe}]});
                //same as above
                //hierarchy.children[countryindex].children[length-1].children.push({"name":data[i].employe});


            }
            flagExist=false;
        }
        else{ //no country match adding new country //with city also as this is new city of new country
            console.log("sparta");
            hierarchy.children.push({"name":data[i].country,"children":[{"name":data[i].city,"children":[{"name":data[i].employe}]}]});

            // hierarchy.children.children.push({"name":data[i].city,"children":[]});
        }


        //console.log(hierarchy);
    }
    hierarchy.children.shift();
 var j=JSON.stringify(hierarchy);

//code ends here

//これは、コードから正常に作成されたjsonです

{

"name":"Hierarchy",
"children":[
{
"name":"America",
"children":[
{
"name":"Kansas",
"children":[{"name":"Jacob"},{"name":"Jeen"}]}]},
{
"name":"Pakistan",
"children":[
{
"name":"Lahore",
"children":
[
{"name":"tahir"},{"name":"bilal"}]},
{
"name":"Islamabad",
"children":[{"name":"fakhar"}]},
{
"name":"Karachi",
"children":[{"name":"eden"}]}]},
{
"name":"India",
"children":
[
{
"name":"d",
"children":
[
{"name":"ali"}]},
{
"name":"Banglore",
"children":[{"name":"PP"},{"name":"JJ"}]}]}]}

元の問題は、現在、3 つのキーの配列のデータに対してこの問題を解決していることです。3 つのネストされたループを使用する必要があるため、オブジェクトのデータ配列に 3 つ以上のキーがある場合は 5 { country:"America", state:"NewYork",city:"newYOrk",street:"elm", employee:'Jacob'}、または私の解決策以上のものは機能せず、キーの数が来る前に決定できません。ここでは再帰が最も適していると思いました。しかし、再帰を書くのは恐ろしく、ケースも複雑です。素晴らしいプログラマーが再帰を書くのを手伝ってくれたり、他の解決策を提案してくれませんか?

4

1 に答える 1

2

私はあなたを助けることができ、再帰的であらゆる長さレベルをサポートする関数を作りましたが、コードは少し長いです

  var data = [
        {country :"America", city:"Kansas", employe:'Jacob'},
        {country :"Pakistan", city:"Lahore", employe:'tahir'},
        {country :"Pakistan", city:"Islamabad", employe:'fakhar'} ,
        {country :"Pakistan", city:"Lahore", employe:'bilal'},
        {country :"India", city:"d", employe:'ali'}  ,
        {country :"Pakistan", city:"Karachi", employe:'eden'},
        {country :"America", city:"Kansas", employe:'Jeen'}  ,
        {country :"India", city:"Banglore", employe:'PP'} ,
        {country :"India", city:"Banglore", employe:'JJ'}  ,

    ];


function groupByLevel( source, levels, config ){
    config = ( typeof config == "object" && config ) || {};

    var internalConfig = {
        keyName: config.keyName || "name",
        collectionName: config.collectionName || "children"
    };

    var hierarchy = {};
    hierarchy[internalConfig.keyName] = "Hierarchy";
    hierarchy[internalConfig.collectionName] = source;

    var sourceArray = [hierarchy];

    for(var i = 0; i < levels.length; i++){

        var newSourceArray = [];

        for(var j = 0; j < sourceArray.length; j++){

            var oldArray = sourceArray[j][internalConfig.collectionName];
            var newArray = groupBy(oldArray, levels[i], internalConfig);            
            sourceArray[j][internalConfig.collectionName] = newArray;
            for(var l = 0; l < newArray.length; l++){
                newSourceArray.push(newArray[l]);
            }
        }
        sourceArray = newSourceArray;
    }
    return hierarchy;
}


function duplicate(obj){
    var newObj = {};
    for(var i in obj) newObj[i] = obj[i];
    return newObj;
}

function objlength(obj){
    var length = 0;
    for(var i in obj) length++;
    return length
}

function groupBy(array, key, config){
    var group = {};

    for(var i = 0; i < array.length; i++){

        var item = array[i];
        var currentKey = item[key];     

        if( ! group[currentKey] ) group[currentKey] = [];

        var clone = duplicate(item);
        delete clone[key];        
        if( objlength(clone) ) group[currentKey].push( clone );

    }
    var returnGroup = [];
    for(var i in group){
        var groupItem = {};
        groupItem[config.keyName] = i;
        if( group[i].length ) groupItem[config.collectionName] = group[i];
        returnGroup.push( groupItem );
    }
    return returnGroup;
}


var result =  groupByLevel(data, ["country", "city", "employe"] );
var yourJson = JSON.stringify(result);

関数 groupByLevel、groupBy、duplicate、および objLength がグループ化を処理します。

このリンクhttp://jsfiddle.net/Castrolol/2TkkW/で、データを使用したよりレベルの高い例を見ることができます。

必要に応じて、1 つのオブジェクトを装着して分離し、再利用可能にすることができます。

私の悪い英語でごめんなさい。

于 2013-11-06T12:50:18.287 に答える