Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的映射嵌套数组_Javascript_Dictionary_Filter_Nested Object - Fatal编程技术网

javascript中的映射嵌套数组

javascript中的映射嵌套数组,javascript,dictionary,filter,nested-object,Javascript,Dictionary,Filter,Nested Object,我有一个嵌套的对象数组,如下所示: let data = [ { id: 1, title: "Abc", children: [ { id: 2, title: "Type 2", children: [ { id: 23, ti

我有一个嵌套的对象数组,如下所示:

let data = [
  {
      id: 1,
      title: "Abc",
      children: [
          {
              id: 2,
              title: "Type 2",
              children: [
                  {
                      id: 23,
                      title: "Number 3",
                      children:[] /* This key needs to be deleted */
                  }
              ]
          },
      ]
  },
  {
      id: 167,
      title: "Cde",
      children:[] /* This key needs to be deleted */
  }
] 
我所要做的就是递归地查找没有子元素的
leaves
(当前为空数组),并从中删除children属性

这是我的密码:

normalizeData(data, arr = []) {
    return data.map((x) => {
        if (Array.isArray(x))
            return this.normalizeData(x, arr)
        return {
            ...x,
            title: x.name,
            children: x.children.length ? [...x.children] : null
        }
    })
}

您需要为此使用递归:

let数据=[{
id:1,
标题:“Abc”,
儿童:[{
id:2,
标题:“第2类”,
儿童:[{
id:23,
标题:“3号”,
子项:[]/*需要删除此密钥*/
}]
}]
},
{
身份证号码:167,
标题:“Cde”,
子项:[]/*需要删除此密钥*/
}
]
函数遍历(obj){
用于(对象中的常数k){
if(对象的类型[k]='object'&&obj[k]!==null){
if(k=='children'&&!obj[k].length){
删除obj[k]
}否则{
导线测量(obj[k])
}
}
}
}
导线测量(数据)
console.log(data)
Nik的答案很好(尽管我不认为像那样访问
子项
键有什么意义),但是如果有帮助的话,这里有一个较短的选择:

let数据=[
{id:1,标题:“Abc”,儿童:[
{id:2,标题:“第2类”,儿童:[
{id:23,标题:“3号”,儿童:[]}
]}
]},
{id:167,标题:“Cde”,儿童:[]}
];
data.forEach(deleteEmptyChildren=o=>
o、 children.length?o.children.forEach(deleteEmptyChildren):删除o.children);

控制台日志(数据)您可以使用递归这样做

因此这里的基本思想是在
removemptychild
函数中检查子项长度是否为非零。因此,如果是这样,我们循环子数组中的每个元素,并将其函数作为参数再次传递,如果子元素长度为零,则删除子元素键

let data=[{id:1,title:“Abc”,子项:[{id:2,title:“Type2”,子项:[{id:23,title:“Number3”,子项:[]},]},{id:167,title:“Cde”,子项:[]},{id:1}]
函数removeEmptyChild(输入){
if(input.children&&input.children.length){
input.children.forEach(e=>removemptychild(e))
}否则{
删除input.children
}
返回输入
}
data.forEach(e=>removemptychild(e))

log(数据)
只需要使用forEach进行简单的递归

let数据=[{
id:1,
标题:“Abc”,
儿童:[{
id:2,
标题:“第2类”,
儿童:[{
id:23,
标题:“3号”,
子项:[]/*需要删除此密钥*/
}]
}, ]
},
{
身份证号码:167,
标题:“Cde”,
子项:[]/*需要删除此密钥*/
}
]
常量清理=数据=>
data.forEach(n=>
n、 儿童身高
?清理(不包括儿童)
:(删除n.儿童)
清理(数据)

console.log(data)
您到现在为止的努力?添加了代码,请看一看这是一个非常好的解决方案如果Objective中没有子项,这将失败。我只是不喜欢额外的循环来初始化它。@CodeManiac仔细查看OP的输入,它似乎总是在这里,即使它是空的(这就是他想从一开始就删除它们的原因)。如果不是这样的话,代码很容易调整。@CodeManiace.children&&e.children.length解决了这个问题,所以没什么大不了的。你为什么要使用map?@epascarello哦,我的错。我在这里忽略了map的使用。谢谢你指出了使用forEach的最佳案例