Javascript 递归地循环对象的对象

Javascript 递归地循环对象的对象,javascript,object,recursion,Javascript,Object,Recursion,我正试图编写一个递归函数来遍历一个对象并根据ID返回项。我可以让第一部分工作,但我很难以递归的方式获得这个函数,并且可以使用一组新的眼睛。代码如下。当您运行代码段时,您会得到一个包含6个项的数组,这对于第一次迭代来说是我想要的,但是如何使用适当的参数调用我的函数来获得嵌套项呢?我的最终目标是将所有以“Cstm”开头的对象(也包括嵌套的对象)添加到tablesAndValues数组中。我试图在这之后对我的代码建模,但这是处理对象数组而不是对象对象。非常感谢您给我的任何提示或提示 JSFiddle:

我正试图编写一个递归函数来遍历一个对象并根据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'));