Javascript 递归地循环对象的对象
我正试图编写一个递归函数来遍历一个对象并根据ID返回项。我可以让第一部分工作,但我很难以递归的方式获得这个函数,并且可以使用一组新的眼睛。代码如下。当您运行代码段时,您会得到一个包含6个项的数组,这对于第一次迭代来说是我想要的,但是如何使用适当的参数调用我的函数来获得嵌套项呢?我的最终目标是将所有以“Cstm”开头的对象(也包括嵌套的对象)添加到tablesAndValues数组中。我试图在这之后对我的代码建模,但这是处理对象数组而不是对象对象。非常感谢您给我的任何提示或提示 JSFiddle:Javascript 递归地循环对象的对象,javascript,object,recursion,Javascript,Object,Recursion,我正试图编写一个递归函数来遍历一个对象并根据ID返回项。我可以让第一部分工作,但我很难以递归的方式获得这个函数,并且可以使用一组新的眼睛。代码如下。当您运行代码段时,您会得到一个包含6个项的数组,这对于第一次迭代来说是我想要的,但是如何使用适当的参数调用我的函数来获得嵌套项呢?我的最终目标是将所有以“Cstm”开头的对象(也包括嵌套的对象)添加到tablesAndValues数组中。我试图在这之后对我的代码建模,但这是处理对象数组而不是对象对象。非常感谢您给我的任何提示或提示 JSFiddle:
const响应={
“数据”:{
“Cstm_PF_ADG_URT_处置”:{
“儿童福利安置价值”:”
},
“Cstm_PF_ADG_URT_人口统计”:{
“学校年级”:“家庭环境”,
“学校等级代码”:
},
“Cstm进阶医学和当前药物”:[
{
“med_名称”:“med1”,
“剂量”:“10mg”,
“频率”:“每日”
},
{
“med_名称”:“med2”,
“剂量”:“20mg”,
“频率”:“每日”
}
],
“Cstm\U PF\U ADG\U URT\U物质使用”:{
“维度1_注释”:“维度1-表1”,
“Textbox1”:“文本-选项卡1”
},
“Cstm\U PF\U ADG\U排放注释”:{
“优先认证号通信”:“认证号-表2”
},
“Cstm-PF-ADG-URT-Clinical-Plan”:{
“cca_cs_dhs_详细信息”:“详细信息-表2”
},
“容器”:{
“Cstm_PF_名称”:{
“第一个名称”:“文本框-页脚的文本相同”,
“姓氏”:“第二个文本框-页脚”
},
“Cstm_PF_ADG_URT_人口统计”:{
“新建字段”:“映射演示-页脚”
},
“网格2”:[
{
“Cstm\U PF\U ADG\U组件诊断”:{
“诊断标签”:“膝盖”,
“诊断组代码”:“leg”
}
},
{
“Cstm\U PF\U ADG\U组件诊断”:{
“诊断标签”:“脚踝”,
“诊断组代码”:“leg”
}
}
]
},
“提交”:正确
}
};
函数getNamesAndValues(数据,id){
const tablesAndValues=[],
res=数据;
Object.entries(res.map)([key,value])=>{
const newKey=key.split(“”“)[0].toLowerCase();
//console.log(newKey)/->“cstm”
if(newKey==id){
tablesAndValues.push({
表:关键,
价值观:价值观
});
}否则{
//我可以记录值和键,并查看要推送的内容
//到tablesAndValues数组,但我似乎无法
//如何推送嵌套项。
//console.log(值);
//控制台日志(键);
//getNamesAndValues(值、键)
}
});
返回表和值;
}
log(getNamesAndValues(response.data,'cstm')代码>您只需要使用rest运算符在else语句中调用push to tablesAndValues,并将值和id作为参数传递
const响应={
“数据”:{
“Cstm_PF_ADG_URT_处置”:{
“儿童福利安置价值”:”
},
“Cstm_PF_ADG_URT_人口统计”:{
“学校年级”:“家庭环境”,
“学校等级代码”:
},
“Cstm进阶医学和当前药物”:[
{
“med_名称”:“med1”,
“剂量”:“10mg”,
“频率”:“每日”
},
{
“med_名称”:“med2”,
“剂量”:“20mg”,
“频率”:“每日”
}
],
“Cstm\U PF\U ADG\U URT\U物质使用”:{
“维度1_注释”:“维度1-表1”,
“Textbox1”:“文本-选项卡1”
},
“Cstm\U PF\U ADG\U排放注释”:{
“优先认证号通信”:“认证号-表2”
},
“Cstm-PF-ADG-URT-Clinical-Plan”:{
“cca_cs_dhs_详细信息”:“详细信息-表2”
},
“容器”:{
“Cstm_PF_名称”:{
“第一个名称”:“文本框-页脚的文本相同”,
“姓氏”:“第二个文本框-页脚”
},
“Cstm_PF_ADG_URT_人口统计”:{
“新建字段”:“映射演示-页脚”
},
“网格2”:[
{
“Cstm\U PF\U ADG\U组件诊断”:{
“诊断标签”:“膝盖”,
“诊断组代码”:“leg”
}
},
{
“Cstm\U PF\U ADG\U组件诊断”:{
“诊断标签”:“脚踝”,
“诊断组代码”:“leg”
}
}
]
},
“提交”:正确
}
};
函数getNamesAndValues(数据,id){
const tablesAndValues=[],
res=数据;
Object.entries(res.map)([key,value])=>{
const newKey=key.split(“”“)[0].toLowerCase();
//console.log(newKey)/->“cstm”
if(newKey==id){
tablesAndValues.push({
表:关键,
价值观:价值观
});
}否则{
//我可以记录值和键,并查看要推送的内容
//到tablesAndValues数组,但我似乎无法
//如何推送嵌套项。
//console.log(值);
//控制台日志(键);
tablesAndValues.push(…getNamesAndValues(值,id))
}
});
返回表和值;
}
log(getNamesAndValues(response.data,'cstm')代码>要通过单次推送实现结果,可以在递归调用时将结果表传递给函数,但在第一次调用时默认为空表。由于未使用返回值,我还将.map
更改为.forEach
:
const响应={
“数据”:{
“Cstm_PF_ADG_URT_处置”:{
“儿童福利安置价值”:”
},
“Cstm_PF_ADG_URT_人口统计”:{
“学校年级”:“家庭环境”,
“学校等级代码”:
},
“Cstm进阶医学和当前药物”:[
{
“med_名称”:“med1”,
“剂量”:“10mg”,
“频率”:“每日”
},
{
“med_名称”:“med2”,
“剂量”:“20mg”,
function getNamesAndValues(data, id, tablesAndValues = []) {
const res = data;
Object.entries(res).map(([key, value]) => {
const newKey = key.split('_')[0].toLowerCase();
const item = res[key];
if (newKey === id) {
tablesAndValues.push({
table: key,
values: value
});
}
if(Array.isArray(item)) {
return item.map(el => getNamesAndValues(el, id, tablesAndValues));
}
if(typeof item === 'object') {
return getNamesAndValues(item, id, tablesAndValues);
}
})
return tablesAndValues;
}
console.log(getNamesAndValues(response.data, 'cstm'));