Javascript 为什么递归不返回新对象?

Javascript 为什么递归不返回新对象?,javascript,typescript,Javascript,Typescript,我有一个递归函数,它迭代一棵树并删除注册表属性不为true的节点 function reduceNodesRegistry(source: any) { if (!source.registry) return source; return { ...source, children: source.children && source.children .map(reduceNo

我有一个递归函数,它迭代一棵树并删除注册表属性不为true的节点

  function reduceNodesRegistry(source: any) {
     if (!source.registry) return source;

    return {
      ...source,
      children:
        source.children &&
        source.children
          .map(reduceNodesRegistry)
          .filter((item: any) => item.registry),
    };
  }

  console.clear();
  console.log("##########");
  console.log(reduceNodesRegistry(source));
带模型的完整代码

为什么函数不隐藏注册表为false的节点

第1版:

  reduceNodesRegistry(source: any) {
    if (typeof source.registry !== "undefined" && source.registry === false)
      return source;

    return {
      ...source,
      children:
        source.children &&
        source.children
          .map(this.reduceNodesRegistry.bind(this))
          .filter(
            (item: any) =>
              typeof item.registry === undefined || item.registry === true
          ),
    };
  }
它不会隐藏注册表为false的节点

第三,我尝试:

  reduceNodesRegistry(node: any) {
    return {
      ...node,
      children:
        node.children &&
        node.children
          .map(this.reduceNodesRegistry.bind(this))
          .filter(
            (node: any) => node.registry || node.registry === "undefined"
          ),
    };
  }

source
没有truthy
注册表
,因此您的
reduceNodeRegistry
直接返回
source
,而无需遍历
子属性

let source = {
    "name": "",
    "children": [...]
}

source
没有truthy
注册表
,因此您的
reduceNodeRegistry
直接返回
source
,而无需遍历
子属性

let source = {
    "name": "",
    "children": [...]
}

与未定义的比较应为以下任一项:

typeof item.registry === “undefined”


与未定义的比较应为以下任一项:

typeof item.registry === “undefined”


第2行表示如果注册表为false,则返回输入。一旦返回被命中,函数中的执行就会停止。好吧,我试着注释这一行,如果这种情况下我得到的结果是空的,你的意思是我应该使用
return?第2行表示如果注册表为false,则返回输入。一旦返回被命中,函数中的执行就会停止。好吧,我试着注释这一行,如果这种情况下我得到的结果是空的,你的意思是我应该使用
return?是的,我知道了。因此,我可以在
.filter()
中条件(source.registry==undefined或source.registry==true)并删除第二行,对吗?检查我的编辑。它仍然不隐藏节点,其中
注册表:false
是的,我得到了这个。因此,我可以在
.filter()
中条件(source.registry==undefined或source.registry==true)并删除第二行,对吗?检查我的编辑。它仍然不会隐藏注册表为false的节点