Javascript 更改嵌套对象';s结构

Javascript 更改嵌套对象';s结构,javascript,vue.js,ecmascript-6,Javascript,Vue.js,Ecmascript 6,我想将一个对象从一种格式转换为另一种格式。到目前为止,我反复尝试这样做的尝试都失败了;要么我得到了最大堆栈异常,要么我无法遍历所有路径 让我们假设我们有一个列出问题及其答案的对象。可能有N个问题和M个答案 开始时的对象: var之前={ 项目:“问题1”, id:'1', 键入:“问题”, 项目:[ { 项目:“答复1”, id:'1.1', 键入:“答案”, 项目: [ { 项目:“问题2”, id:'1.1.1', 键入:“问题”, 项目:[ { 项目:'答案2.1', id:'1.1.1.

我想将一个对象从一种格式转换为另一种格式。到目前为止,我反复尝试这样做的尝试都失败了;要么我得到了最大堆栈异常,要么我无法遍历所有路径

让我们假设我们有一个列出问题及其答案的对象。可能有N个问题和M个答案

开始时的对象:

var之前={
项目:“问题1”,
id:'1',
键入:“问题”,
项目:[
{
项目:“答复1”,
id:'1.1',
键入:“答案”,
项目:
[
{
项目:“问题2”,
id:'1.1.1',
键入:“问题”,
项目:[
{
项目:'答案2.1',
id:'1.1.1.1',
键入:“答案”
},
{
项目:'答案2.2',
id:'1.1.1.2',
键入:“答案”
}
]
}   
// ...          
]
}, {
项目:“答复1”,
id:'1.2',
键入:“答案”,
项目:
[
{
项目:“问题3”,
id:'1.2.1',
键入:“问题”,
项目:[
{
项目:“答案3.1”,
id:'1.2.1.1',
键入:“答案”
},
{
项目:“答案3.2”,
id:'1.2.1.2',
键入:“答案”
}
]
}   
// ...          
]
}
// ...
]
}
对象它应该是什么样子(将所有项包装在“items”数组中;将键名“item”更改为“title”,“id”更改为“key”,删除“type”,根据“type”添加“color”):

var之后={
项目:[
{
标题:"问题1",,
键:“1”,
颜色:“红色”,
项目:[
{
标题:“答案1”,
关键字:“1.1”,
颜色:“蓝色”,
项目:
[
{
标题:"问题2",,
关键字:“1.1.1”,
颜色:“红色”,
项目:[
{
标题:“答案2.1”,
关键字:“1.1.1.1”,
颜色:“蓝色”
},
{
标题:“答案2.2”,
关键字:“1.1.1.2”,
颜色:“蓝色”
}
]
}   
// ...          
]
}, {
标题:“答案1”,
关键字:“1.2”,
颜色:“蓝色”,
项目:
[
{
标题:"问题3",,
关键字:“1.2.1”,
颜色:“红色”,
项目:[
{
标题:“答案3.1”,
关键字:“1.2.1.1”,
颜色:“蓝色”
},
{
标题:“答案3.2”,
关键字:“1.2.1.2”,
颜色:“蓝色”
}
]
}   
// ...          
]
}
// ...
]
}
]
}
这似乎很容易,但我无法让它工作。这就是我尝试迭代的方式:

功能iter(o){
for(让k进入o){
if(!(['item','items','id'].includes(k))//我的对象还包含一些键,我不想再深入下去了
持续
if(o[k]!==null&&typeof o[k]==='object'){
iter(o[k]);//最大堆栈异常
返回;
}
}
};

多谢各位

您可以使用map实现这一点,我编写了一个简单的测试来说明我的观点

这是代码的重要部分

function rename(item: any) {
  return {
    title: item.item,
    key: item.id,
    color: item.type === 'Question' ?  'red' : 'blue',
    items: item.items?.map(rename)
  }
}

console.log(items.map(rename))
当然,如果您使用的是typescript,请将
any
更改为适当的类型,并注意我使用的是
运算符,该运算符不适用于javascript,因此您可以执行以下操作

...
items: item.items ? item.items.map(rename) : undefined
... 

你可以用map实现这个,我写了一个简单的测试来说明我的观点

这是代码的重要部分

function rename(item: any) {
  return {
    title: item.item,
    key: item.id,
    color: item.type === 'Question' ?  'red' : 'blue',
    items: item.items?.map(rename)
  }
}

console.log(items.map(rename))
当然,如果您使用的是typescript,请将
any
更改为适当的类型,并注意我使用的是
运算符,该运算符不适用于javascript,因此您可以执行以下操作

...
items: item.items ? item.items.map(rename) : undefined
... 

可以映射对象、重命名键和映射嵌套项

const
iter=({item:title,id:key,type,items,…o})=>({
标题
钥匙
颜色:“颜色”+键,
……哦,
…(items&&{items:items.map(iter)})
}),
before={item:'Question 1',id:'1',type:'Question',items:[{item:'response 1',id:'1.1',items:[{item:'response 2.1',id:'1.1.1',type:'Answe