JavaScript 在遍历 JSON 树时更改路径

标签 javascript jquery

<分区>

目前,从this fiddle可以看出,我将一个 JSON 存储为变量:

const tree = { ...
}

然后 JS 遍历整个树,搜索 '201603' 下的所有结果:

const Chart201603 = walk(tree, '201603');

最后,脚本然后仅搜索要显示的“浓度”节点:

const Chart201603_Concentration = Chart201603.map(entry => {
        return entry.Concentration;
      });

然后将在“201603”和“浓度”下的整个树中找到的数字数组以及数组的总和打印到我的 HTML 中的跨度:

Array

我还可以通过更改此行来指定我希望 JS 在树中的哪个位置查找此信息:

const Chart201603 = walk(tree, '201603');

像这样:

const Chart201603 = walk(tree.BILL.Municipal, '201603');

现在返回的结果较少,因为它跳过了一些节点:

New Array

然而,我想要做的不是像这样将所需路径硬编码到 JS 中,而是让它等于文本区域或跨度等的值。

类似于 this .

现在有一个值设置如下的跨度:

<span id="value">BILL.Municipal</span>

我已经创建了一个 span 值的变量:

const newPath = document.getElementById('value').innerHTML;

但是现在当我这样设置路径时:

const Chart201603 = walk(tree.newPath, '201603');

它不返回任何结果。

有人可以帮忙解决这个问题吗?并建议我如何才能使这种方法起作用?

如果您不想使用 JSFiddle 进行测试,这里也是代码:

const walk = (root, filter) => {
  const result = [];
  const follow = (root) => {
    if (root instanceof Array) {
      root.forEach(elem => {
        follow(elem);
      });
    } else if (root instanceof Object) {
      Object.keys(root).forEach(elem => {
        if (elem === filter) {
          result.push(root[elem]);
        } else {
          follow(root[elem]);
        }
      });
    }
  };
  follow(root);
  return result;
};

const tree = {
"BILL" : {
	"Municipal" : {
    "CAD" : {
      "Short" : {
        "Low" : {
          "High" : {
            "N" : {
              "CANADA" : {
                "IssueName00085" : {
                  "CA6832Z57Z70" : {
                    "201603" : {
                    	"Concentration" : 2,
                      "ConcentrationTier1" : 2,
                      "ConcentrationTier2" : 0,
                      "LargestTicket" : 0,
                      "Maturity" : 201708,
                      "Outstanding" : 140,
                      "SmallestTicket" : 0,
                      "Turnover" : 0,
                      "TurnoverTeir2" : 0,
                      "TurnoverTier1" : 0
                    },
                    "201604" : {
                      "Concentration" : 6,
                      "ConcentrationTier1" : 3,
                      "ConcentrationTier2" : 3,
                      "LargestTicket" : 0,
                      "Maturity" : 201708,
                      "Outstanding" : 140,
                      "SmallestTicket" : 0,
                      "Turnover" : 0,
                      "TurnoverTeir2" : 0,
                      "TurnoverTier1" : 0
                    }
                   }
                  }
                 },
                 "USA" : {
                 	 "IssueName00953" : {
                     "USA688I57Z70" : {
                        "201603" : {
                          "Concentration" : 4,
                          "ConcentrationTier1" : 2,
                          "ConcentrationTier2" : 2,
                          "LargestTicket" : 0,
                          "Maturity" : 201708,
                          "Outstanding" : 40,
                          "SmallestTicket" : 0,
                          "Turnover" : 0,
                          "TurnoverTeir2" : 0,
                          "TurnoverTier1" : 0
                        },
                        "201604" : {
                          "Concentration" : 9,
                          "ConcentrationTier1" : 7,
                          "ConcentrationTier2" : 2,
                          "LargestTicket" : 0,
                          "Maturity" : 201708,
                          "Outstanding" : 140,
                          "SmallestTicket" : 0,
                          "Turnover" : 0,
                          "TurnoverTeir2" : 0,
                          "TurnoverTier1" : 0
                    }
                   }
                  }
                 }
                }
               }
              }
             }
            }
           },
           	"Sovereign" : {
    "USD" : {
      "Short" : {
        "High" : {
          "High" : {
            "N" : {
              "MEXICO" : {
                "IssueName00385" : {
                  "ME6832Z57Z70" : {
                    "201603" : {
                    	"Concentration" : 9,
                      "ConcentrationTier1" : 2,
                      "ConcentrationTier2" : 7,
                      "LargestTicket" : 0,
                      "Maturity" : 201708,
                      "Outstanding" : 140,
                      "SmallestTicket" : 0,
                      "Turnover" : 0,
                      "TurnoverTeir2" : 0,
                      "TurnoverTier1" : 0
                    },
                    "201604" : {
                      "Concentration" : 16,
                      "ConcentrationTier1" : 3,
                      "ConcentrationTier2" : 13,
                      "LargestTicket" : 0,
                      "Maturity" : 201708,
                      "Outstanding" : 140,
                      "SmallestTicket" : 0,
                      "Turnover" : 0,
                      "TurnoverTeir2" : 0,
                      "TurnoverTier1" : 0
                    }
                   }
                  }
                 },
                 "USA" : {
                 	 "IssueName00953" : {
                     "USA688I57Z70" : {
                        "201603" : {
                          "Concentration" : 4,
                          "ConcentrationTier1" : 2,
                          "ConcentrationTier2" : 2,
                          "LargestTicket" : 0,
                          "Maturity" : 201708,
                          "Outstanding" : 40,
                          "SmallestTicket" : 0,
                          "Turnover" : 0,
                          "TurnoverTeir2" : 0,
                          "TurnoverTier1" : 0
                        },
                        "201604" : {
                          "Concentration" : 9,
                          "ConcentrationTier1" : 7,
                          "ConcentrationTier2" : 2,
                          "LargestTicket" : 0,
                          "Maturity" : 201708,
                          "Outstanding" : 140,
                          "SmallestTicket" : 0,
                          "Turnover" : 0,
                          "TurnoverTeir2" : 0,
                          "TurnoverTier1" : 0
                    }
                   }
                  }
                 }
                }
               }
              }
             }
            }
           }
					}
				 }
         
         const newPath = document.getElementById('value').innerHTML;
         
         console.log(newPath)
         
         const Chart201603 = walk(tree.newPath, '201603');

          const Chart201603_Concentration = Chart201603.map(entry => {
            return entry.Concentration;
          });

          document.getElementById("Array201603Concentration").innerHTML = Chart201603_Concentration.join(' ');

          var ConcentrationSum = Chart201603_Concentration.reduce((total, num) => {
            return total + num;
          }, 0);
          
           document.getElementById("Array201603ConcentrationSum").innerHTML = ConcentrationSum;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span id="value">BILL.Municipal</span>

<p>Array: <span id="Array201603Concentration"></span></p>

<p>Array Sum: <span id="Array201603ConcentrationSum"></span></p>

最佳答案

tree.newPath 在树对象中查找名为“newPath”的键

使用这样的函数来获取所需的节点:

function getNodeByPathString(path) {
  var node = tree;
  var partsOfPath = path.split('.');
  while(let part = partsOfPath.shift())
    node = node[part];
  return node;
}

关于JavaScript 在遍历 JSON 树时更改路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45863430/

相关文章:

javascript - 在 Vue 应用程序模板中,使用 ASYNC/AWAIT(Nativescript Playground)显示从 API 获取的数据

javascript - 按下提交按钮后延迟 jQuery Ajax 加载器 3 秒

javascript - 在继续执行 JavaScript 之前等待页面加载

javascript - 无法在 zend 框架 2 中使用 ajax 发布值

javascript - 固定位置高度按百分比大于浏览器窗口

jquery - 如何在 jQuery Mobile 中获取选中的单选按钮值?

jQuery 滚动一页导航菜单 Bug

javascript - 如何使网站支持 VIM 键绑定(bind)?

javascript - 如何使用 getMetaProperty 或访问商店中的元数据?

android - 复选框 onchange 事件 android cordova visual studio 不工作