如何防止递归函数重新初始化累加变量?

2024-04-12

这个函数是用 JavaScript 编写的,但我认为这个概念可以用其他一些编程语言来实现。

function uniteUnique(arr) {
    let seenBefore = []; //the accumulating array
    for (let item of arguments) {
        if (typeof (item) == "object") {
            uniteUnique(...item);
        }
        else if (!seenBefore.includes(item)) {
            seenBefore.push(item);
        }
    }
    return seenBefore;
}

简而言之,该函数迭代它作为参数接收的数组,这些数组本身可能包含也可能不包含其他数组。这些数组的最深层包含int价值观。该函数返回一个包含所有这些的数组ints(即出现在嵌套数组中的那些),但它只返回每个 int 一次,即使它出现多次。

我的问题在于,每次递归返回到更高的级别时,它再次初始化包含保存的数组ints,即函数需要返回的数组(seenBefore),因此破坏了整个过程。一方面,我必须在函数启动时初始化数组,但另一方面,它会被多次初始化并丢失以前存储的值。

例如,如果我要运行该函数

uniteUnique([1, 3, [6, 3], 2], [5, 2, 1, 4], [2, 1]);

输出应该是

[1,3,6,2,5,4]

因为该函数必须按照处理顺序仅返回一次偶然发现的数字。该函数实际上返回一个空数组,因为它在函数从递归的最顶层返回之前再次初始化。

我怎样才能绕过这个问题?

(P.S:我知道这可以通过将累积数组从函数中拉出到不同的作用域来“解决”,但这会导致其他问题,例如如果我运行,则每次运行该函数之前都需要重新初始化累积数组不止一次。)


你错误地识别了你的问题。每次致电uniteUnique()局部变量有一个单独的值seenBefore-- 在递归调用期间,没有任何内容被“再次初始化”。

你真正的问题是这一行:

uniteUnique(...item);

丢弃该函数调用的结果,因此任何嵌套数组的内容都将被忽略。您需要将该函数的返回值分配到某处并使用它。

您可能还想将此函数调用的条件更改为:

if (Array.isArray(item)) {

作为目前的状况typeof item == "object"将包含无法迭代的对象。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止递归函数重新初始化累加变量? 的相关文章

  • 节点遗留 url.parse 已弃用,用什么代替?

    require url parse someurl com page 已被仅弃用 并且我们严格的 linter 对此不满意 我尝试用互联网建议的内容替换我们的代码中的它new URL someurl com page 在大多数情况下都有效
  • Brunch 源映射:在 Chrome 开发工具中未命中断点

    我正在使用 Brunch 中内置的默认源映射 我看到文件很好 但无法在源映射文件中命中断点 使用 Javascript 访问调试器debugger 有效 这让我相信早午餐方面出了问题 这是我的 brunch config js module
  • JavaScript 画布内存问题

    我在用着getImageData putImageData在 HTML5 画布上能够操作图片 我的问题是浏览器似乎从来没有释放任何内存 http jonelf posterous com lite gc men for sent 直到我关闭
  • Typescript:匿名函数内可能未定义的变量

    太长了 在匿名函数中使用变量之前检查变量仍然 TS 警告变量可能未定义 在下面的代码示例中变量baseDirId检查是否未定义 然后传递给 array map 函数 但 TS 发出警告baseDirId可以是未定义的 Typescript
  • 使用javascript滚动滚动条或鼠标滚轮后触发事件

    我想知道是否可以触发事件after使用滚动条或鼠标滚轮 或在触摸设备上滑动 时滚动页面 基本上 我想检测用户何时停止滚动 以便我可以进行 AJAX 加载 而不是在滚动时加载 看起来jQuery s scroll 每次用户滚动时都会触发 并且
  • 玉石压痕错误

    因此 对于我的 Express 网站 我使用 jade 所以我决定尝试修改我的布局文件 以便我可以开始设计我的网站 我修改了原始布局代码 有效 但我开始在任何扩展布局的文件中出现缩进错误 如下所示 500 Error home kevin
  • 无需重定向的 HTML 页面提交

    有没有什么方法可以在不使用ajax的情况下提交html表单而无需从当前页面重定向 你可以设置一个target 为您form 这样您就可以将表单提交到新选项卡 target blank 或一个小的 隐藏的iframe target nameo
  • 指定 HTML5 输入类型 = 日期的值输出?

    我想将本机日期选择器添加到我的应用程序中 该应用程序当前使用遗留的本地系统 日期输入支持尚未广泛普及 但如果我可以基于兼容性提供这两种实现 那就太理想了 有没有办法指定 HTML 日期选择器给出的值的输出 歌剧的默认设置是yyyy mm d
  • 替换img路径jquery

    我正在尝试替换 jquery 中的 img 路径 注入远程页面 replaceexample com thumbs withexample com images 我已经尝试过这个 但似乎不起作用 img attr src replace t
  • 在给定索引上将字符串分成两部分并返回两部分

    我有一个字符串 需要在给定索引上拆分 然后返回两个部分 并用逗号分隔 例如 string 8211 8 211 98700 98 700 因此 我需要能够在任何给定索引上拆分字符串 然后返回字符串的两半 内置方法似乎执行分割 但只返回分割的
  • 如何在数据表角度中基于 JSON 动态填充表值?

    我在用着Angular 数据表 https l lin github io angular datatables 我需要能够根据返回的数据动态创建表 换句话说 我不想指定列标题 Example json数据 id 2 city Baltim
  • 将默认搜索文本添加到搜索框 html

    我正在努力将 搜索 文本添加到搜索框 我正在努力实现 onfocus 消失文本 And onblur 重新出现文本 到目前为止 我已经实现了这一点 但我必须将其硬编码为 html eg
  • 当rest api应用程序服务器(express)和Angulars js应用程序在不同端口上运行时出现Cors问题

    我有用node js编写的rest api应用程序 express在端口3000上运行 而angularjs应用程序在同一服务器上的端口9001上运行 从 angularjs 应用程序调用 rst api 时 出现了 cors 问题 在re
  • D3 强制布局,较大的节点聚集在中心

    我一直在修改将用于标签云的强制布局 每个标签都由一个
  • jQuery:向左滑动和向右滑动

    我见过slideUp and slideDown在 jQuery 中 左右滑动的功能 方式怎么样 您可以使用 jQuery UI 中的附加效果来做到这一点 详情请参阅此处 http docs jquery com UI Effects Sl
  • jQuery UI 对话框 - 关闭后无法打开

    我有一个问题jquery ui dialog box https jqueryui com dialog 问题是 当我关闭对话框然后单击触发它的链接时 除非刷新页面 否则它不会再次弹出 如何在不刷新实际页面的情况下回调对话框 下面是我的代码
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • HTML5 地理定位 - 在 iOS 上无法始终工作

    目前正在使用 HTML5 地理定位 我已经在所有网络浏览器上测试了它 它似乎工作正常 然而 当我在 iPad 上测试地理定位时 它在 iPad mini 上始终有效 但当我将其放在更大的 iPad iPad 2 上时 位置似乎并不总是有效
  • 如何强制下载图片?

    我的页面上有一个动态生成的图像 如下所示 img src 我不想告诉我的用户右键单击图像并点击保存 而是想公开一个下载链接 单击该链接将提示下载图像 如何实现这一目标 最初我在 js 中尝试这样做 var path my image att
  • 拉斐尔路径交叉点不起作用

    我对拉斐尔和 pathIntersection method JSFiddle 示例 http jsfiddle net t6gWt 2 您可以看到有两条线都与曲线相交 但当我使用 pathIntersection method 有一个未解

随机推荐

  • OS X Mavericks 安装 rvm 警告

    在终端中运行时 curl L https get rvm io bash s 它似乎工作正常 但在最后的升级说明中它说 WARNING You have profile file you might want to load it to d
  • 获取 HealthKit 中每个日期的总步数

    获取每天记录的总步数的最佳方法是什么HealthKit 通过 HKSampleQuery 的方法 initWithSampleType 见下文 我可以使用以下命令设置查询的开始和结束日期NSPredicate 但该方法每天返回一个包含许多
  • sqlite 退后一步

    我发现向前滚动结果集的常用方法是使用 sqlite3 step while sqlite3 step statement SQLITE ROW do something with the row 有没有办法向后滚动结果集 例如后退一步或使用
  • 代码签名:我应该签署哪些文件类型以及为什么?

    我有一个全新的代码签名证书 并且一直想知道我应该签署哪些文件 显然 应该对 setup msi 包和所有运行提升的 exe 进行签名 以避免出现 未知发布者 警告 但我应该对其他可执行文件进行签名吗 不需要提升的 exe dll 或 oxc
  • 如何排除 Android Eclipse 项目的“/res”文件夹中的文件

    有什么方法可以排除 res 文件夹下的某些文件不被 Android 构建器处理吗 我有几个使用 Eclipse 构建的 Android 项目 我将这些项目上传到我们的版本控制系统中 问题是 版本控制向每个文件夹添加了一些 project p
  • CSS 自动宽度布局,无边距:auto

    这可以用 css 实现吗 我可以用 javascript 来管理它 它基本上是一个margin auto效果 但我想要每个边距有不同的背景 所以我正在寻找 固定宽度 中心 div 两侧具有自动宽度的 div 如果有意义的话 问题更直观 ht
  • Typescript 限制最大数组长度

    基本上我想要一个最大长度为 4 的数组类型 我很容易无法找到如何在打字稿中实现此检查 有人可以帮我吗 像这样的事情 const a item1 item2 item3 item4 item5 gt array has a maximum l
  • 如何从 python 将无穷大传递给 redis?

    我正在使用 redis py 并希望将 inf 和 inf 与 ZRANGEBYSCORE 一起使用 我尝试使用 inf 的字符串和浮点来执行此操作 但它们返回一个空集 我怎样才能做到这一点 EDIT 我尝试执行以下命令 redis Str
  • iPhone iOS 如何使 UIRotationGestureRecognizer 和 UIPinchGestureRecognizer 一起工作来缩放和旋转带有子视图的 UIView?

    我正在我的应用程序中实现拖 放 调整大小 旋转标签 到目前为止 除了UIRotationGestureRecognizer手势 更具体地说 它不适用于UIPinchGestureRecognizer手势 通常 这两个手势会竞争两个手指触摸
  • C# 项目,编译器抱怨缺少对 log4net 的引用

    我正在使用 Visual Studio 2017 构建一个大型 C 项目 解决方案中有 200 多个项目 在编译其中一个项目时 我遇到了很多错误 如下所示 error CS0012 The type BufferingAppenderSke
  • 有没有办法“完全”禁用“编辑并继续”?

    我想知道是否有一种方法可以在 Visual Studio 2008 中调试代码时完全锁定我的代码 当作为 64 位应用程序运行时 代码文档会自动锁定 这是我非常喜欢的 然而 我的大部分编码都是为 Excel 制作加载项 它是 32 位的 结
  • 当我在 xcode 项目中使用 #include 行时,它在哪里查找 gl.h 文件?

    我正在将 Linux 的开源 C 程序移植到 os x 我一直在改变线路 include
  • 自定义图像作为单选按钮

    我一直在尝试使用 HTML CSS 和 JavaScript 制作自定义单选按钮 我一直在浏览之前有关单选按钮的问题 我觉得我已经实施了这些建议 但我的 jpeg 图像仍然被切成两半 我显然错过了一些东西 但不确定它是什么 下面是我的 HT
  • Python Flask 未与 docker-compose 一起运行 [重复]

    这个问题在这里已经有答案了 我有一个简单的 Flask 应用程序 由 Web 部分和数据库部分组成 代码可以找到here https github com wiwa1978 flask employees 在本地运行这个 Flask 应用程
  • 使用自签名证书对 OS X 应用程序进行协同签名有何影响?

    Apple 似乎将某些 OS X API 例如沙箱 限制为由可信证书共同签名的应用程序 例如一份发给付费 Mac 开发者计划的成员 OS X 如何对待使用自签名 或开发 证书联合签名的应用程序 这些功能 API 是否可用 唯一的区别是使用默
  • ./sysroot.sh:不允许操作

    我正在尝试安装 cydia 源代码 git clone git git saurik com cydia git cd cydia 但是当我输入 sysroot sh 时 我收到此错误 bash sysroot sh usr bin env
  • vscode 中使用 antd 框架的按钮提示

    我在 vscode 中使用 antd 的按钮和输入 但它在按钮上显示错误 我想知道为什么 我试过输入法 没有显示错误 如图所示 import React from react import styles from index css imp
  • 更新 ZipArchive 中的文件

    我有一个 ZipArchive 对象 其中包含我正在修改的 XML 文件 然后我想返回修改后的 ZipArchive 这是我的代码 var package File ReadAllBytes location of existing zip
  • Composer - vcs 上请求的包问题

    我分叉了https github com calebporzio onboard https github com calebporzio onboard to https github com mpjraaij onboard tree
  • 如何防止递归函数重新初始化累加变量?

    这个函数是用 JavaScript 编写的 但我认为这个概念可以用其他一些编程语言来实现 function uniteUnique arr let seenBefore the accumulating array for let item