2016-10-07 14 views
1

私はオブジェクトの配列を持っています。各アイテムにはパレットIDが記載されています。ネストされたオブジェクトを作成して、ネストされたオブジェクトがサブカテゴリと同程度になるようにしたい。以下の入力と期待される出力。どのように私はプレーンJSでこれを達成することができますか?Javascript配列からネストしたオブジェクトを作成する

var inputArr = [ 
 
    { 
 
    category_id: 1, 
 
    parent_category_id: 3, 
 
    title: "category1" 
 
    }, 
 
    { 
 
    category_id: 2, 
 
    parent_category_id: 1, 
 
    title: "category2" 
 
    }, 
 
    { 
 
    category_id: 3, 
 
    title: "category3" 
 
    }, 
 
    { 
 
    category_id: 4, 
 
    parent_category_id: 1, 
 
    title: "category4" 
 
    }, 
 
    { 
 
    category_id: 5, 
 
    parent_category_id: 2, 
 
    title: "category5" 
 
    } 
 
] 
 

 

 
var expectedOutput = { 
 
    category_id: 3, 
 
    title: "category3", 
 
    subcategories: [ 
 
    { 
 
     category_id: 1, 
 
     subcategories: [ 
 
     { 
 
     category_id: 2, 
 
     title: "category2", 
 
     subcategories: [ 
 
      { 
 
      category_id: 5, 
 
      title: "category5" 
 
      } 
 
     ] 
 
     }, 
 
     { 
 
     category_id: 4, 
 
     title: "category4" 
 
     } 
 
     ] 
 
    } 
 
    ] 
 
}

+0

"どのように" 常にいくつかのコードを書い伴います。それで、あなたはこれまで何を書いていますか? –

+0

私はreduceを使ってループを使ってやってみました。しかし、入れ子にする手掛かりがない。私が試したものは半分にすぎないので、本当にそれを追加する必要がありますか?私は、その理由から、あなたは否定的なポイントを与えなければならないと思う – jintoppy

答えて

1

var inputArr = [ 
 
    { 
 
     category_id: 1, 
 
     parent_category_id: 3, 
 
     title: "category1" 
 
    }, 
 
    { 
 
     category_id: 2, 
 
     parent_category_id: 1, 
 
     title: "category2" 
 
    }, 
 
    { 
 
     category_id: 3, 
 
     title: "category3" 
 
    }, 
 
    { 
 
     category_id: 4, 
 
     parent_category_id: 1, 
 
     title: "category4" 
 
    }, 
 
    { 
 
     category_id: 5, 
 
     parent_category_id: 2, 
 
     title: "category5" 
 
    } 
 
]; 
 

 
var temp = []; 
 
var parent; 
 

 
for (var i = 0; i < inputArr.length; i++) { 
 
    
 
    if (temp[inputArr[i].category_id]) { 
 
    Object.assign(temp[inputArr[i].category_id], inputArr[i]); 
 
    } else { 
 
    temp[inputArr[i].category_id] = inputArr[i]; 
 
    // uncomment the following assignment to add empty subcategories 
 
    // array to leaf nodes for consistency. 
 
    // temp[inputArr[i].category_id].subcategories = []; 
 
    } 
 

 
    var parentId = inputArr[i].parent_category_id; 
 
    if (!parentId) { 
 
    parent = temp[inputArr[i].category_id]; 
 
    } else { 
 
    if (!temp[parentId]) { 
 
     temp[parentId] = { 
 
     category_id: parentId, 
 
     parent_category_id: undefined, 
 
     title: undefined, 
 
     subcategories: [temp[inputArr[i].category_id]] 
 
     } 
 
    } else { 
 
     temp[parentId].subcategories = temp[parentId].subcategories || []; 
 
     temp[parentId].subcategories.push(temp[inputArr[i].category_id]); 
 
    } 
 
    } 
 
    
 
    delete temp[inputArr[i].category_id].parent_category_id; 
 
} 
 

 
temp = undefined; 
 

 
document.write('<code><pre>' + JSON.stringify(parent, null, 2) + '</pre></code>');

関連する問題