javascript – 如何遍历Object并创建树对象

前端之家收集整理的这篇文章主要介绍了javascript – 如何遍历Object并创建树对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个平面对象和一个数组,我需要从中构造一个树状对象.

  1. choices: ['choice1','choice2','choice3'];
  2. items: [
  3. {
  4. choice1: 'taste',choice2: 'good',choice3: 'green-lemon'
  5. },{
  6. choice1: 'taste',choice2: 'bad',choice3: 'green-lemon'
  7. }
  8. ];

该数组描述了每个选择在树中的级别.我不知道以后会有多少选择,项目或级别.

如何获取以下对象:

  1. output: {
  2. taste: {
  3. good: {
  4. green-lemon:1
  5. },bad: {
  6. green-lemon:1
  7. }
  8. }
  9. }

我需要得到一个对象来描述每个级别上有多少项.在这个例子中,这是choice1:1;选择2:2,每个选择3:1.

有关如何构建循环以获得此结果的任何建议?

最佳答案
我认为这里最好的解决方案是带有一些递归的循环.我已经增加了示例中模型的大小,以显示它与n级相关.使用javascript控制台检查输出.

  1. var choices = ['choice1','choice3'];
  2. var items = [{
  3. choice1: 'taste',choice3: 'green-lemon'
  4. },{
  5. choice1: 'taste',choice2: 'ok',choice3: 'green-lemon'
  6. }];
  7. function IsLastLevel(levelIndex) {
  8. return (levelIndex == choices.length - 1);
  9. }
  10. function HandleLevel(currentItem,currentLevel,nextChoiceIndex) {
  11. var nextLevelName = currentItem[choices[nextChoiceIndex]];
  12. if (typeof currentLevel[nextLevelName] === 'undefined') {
  13. currentLevel[nextLevelName] = {};
  14. }
  15. if (IsLastLevel(nextChoiceIndex)) {
  16. if (currentLevel[nextLevelName] > 0) {
  17. currentLevel[nextLevelName]++;
  18. } else {
  19. currentLevel[nextLevelName] = 1;
  20. }
  21. } else {
  22. var goOneDeeper = nextChoiceIndex + 1;
  23. HandleLevel(currentItem,currentLevel[nextLevelName],goOneDeeper);
  24. }
  25. }
  26. var output = {};
  27. for(var itemIndex in items)
  28. {
  29. var item = items[itemIndex];
  30. HandleLevel(item,output,0);
  31. }
  32. console.log(output);

JsFiddle Demo

猜你在找的JavaScript相关文章