尽管记录的值具有数字,但 Javascript 从“推送”操作返回稀疏数组

     2023-02-22     69

关键词:

【中文标题】尽管记录的值具有数字,但 Javascript 从“推送”操作返回稀疏数组【英文标题】:Javascript returning a sparse array from "push" operations despite the logged value having numbers 【发布时间】:2018-08-17 06:40:51 【问题描述】:

我正在研究我的回溯算法技能,但遇到了问题。问题是生成不同整数数组的所有排列,即 permute([1,2,3]) => [[1,3,2], [1,2,3], [2,1,3], [2,3,1], [3,1, 2], [3,2,1]]

我是这样写的:

var permute = function(nums) 
        var backtrack = function(nums, chosen, solutions) 
          if (chosen.length === nums.length) 
              // I'm not mutating nums.length so I don't get why this is pushing on empty arrays
              console.log(chosen); 
              solutions.push(chosen);
           else 
              for (let i = 0; i < nums.length; i++) 
                  if (!chosen.includes(nums[i])) 
                      chosen.push(nums[i]);
                      backtrack(nums, chosen, solutions);
                      chosen.pop();              
                  
              
          
        
        var chosen = [];
        var solutions = [];
        backtrack(nums, chosen, solutions);
        return solutions;

当我在第 5 行注销 chosen 数组变量时,它有 4 个值,正如我所料。但是,我注意到 Javascript 声称它有 4 个值,但长度属性为零。这意味着当我运行我的函数permute([1,2,3]) 时,我得到[[], [], [], [], [], []] 或稀疏数组的nums.length 阶乘的结果。我怀疑我的循环是问题所在,我没有完全理解我传递的所有这些数组引用,但我不确定还能做什么。注销chosen 是我所期望的。感谢您的帮助或进一步阅读。

这并非特定于 Chrome 控制台环境。如果我在节点 repl 中运行它,我会看到相同的行为。

【问题讨论】:

见***.com/questions/23429203/… 我在你的代码中看不到任何稀疏数组,因为你总是pushing。 (这是一件好事,如果可以避免,稀疏数组不应该存在) 【参考方案1】:

你改变了同一个数组chosen。要推送结果,您可以添加 chosen 数组的副本。

solutions.push(chosen.slice());

部分

for (let i = 0; i < nums.length; i++) 
    if (!chosen.includes(nums[i])) 
        chosen.push(nums[i]);
        backtrack(nums, chosen, solutions);
        chosen.pop();
    

迭代nums 的所有元素并检查该值是否已经在chosen 中。如果不是,则将该值推入数组chosen。然后进行回溯,在此之后,chosen 的最后一个值被删除。

最后chosen是一个空数组,是同一个数组/对象引用的push结果。

因此,您获得了正确数量的项目 (6),但始终是相同的空数组。

var permute = function(nums) 
        var backtrack = function(nums, chosen, solutions) 
          if (chosen.length === nums.length) 
              // I'm not mutating nums.length so I don't get why this is pushing on empty arrays
              //console.log(chosen); 
              solutions.push(chosen.slice());
           else 
              for (let i = 0; i < nums.length; i++) 
                  if (!chosen.includes(nums[i])) 
                      chosen.push(nums[i]);
                      backtrack(nums, chosen, solutions);
                      chosen.pop();              
                  
              
          
        
        var chosen = [];
        var solutions = [];
        backtrack(nums, chosen, solutions);
        return solutions;


console.log(permute([1, 2, 3]));
.as-console-wrapper  max-height: 100% !important; top: 0; 

【讨论】:

谢谢,这很好用。当比较数组长度的 if 块无法运行时,您能否解释一下为什么 chosen [] 的原始值是解决方案的一部分?即 [].length 永远不会等于 [1,2,3].length?

尽管从 Firebase 添加了项目,但 ArrayList 的大小仍然为零

】尽管从Firebase添加了项目,但ArrayList的大小仍然为零【英文标题】:ArrayListsizeremainszerodespiteaddingitemsfromFirebase【发布时间】:2020-10-2204:26:22【问题描述】:我有以下代码应该从Firebase读取数据并将其添加到数组列表namesList和addre... 查看详情

尽管记录不存在,但 SQL 主键约束

】尽管记录不存在,但SQL主键约束【英文标题】:SQLprimarykeyconstraintalthoughrecorddoesnotexist【发布时间】:2013-05-1311:24:04【问题描述】:我收到以下错误:违反主键约束“PK_ss_student_grade”。无法在对象“dbo.ss_student_grade”中插入重... 查看详情

Javascript:从包含对象的多维数组中返回不匹配的值

】Javascript:从包含对象的多维数组中返回不匹配的值【英文标题】:Javascript:ReturnUnmatchedvaluefrommultidimensionalarraysthatcontainsobject【发布时间】:2018-10-0914:52:20【问题描述】:我有两个多维数组,每个数组都包含一些对象(键/值)... 查看详情

如何将 Typescript 类型定义为字符串字典但具有一个数字“id”属性

...operty【发布时间】:2021-11-1014:42:23【问题描述】:现有的JavaScript代码具有“记录”,其中id为数字,其他属性为字符串。尝试定义这种类型:typet=id:n 查看详情

Extjs 组合框显示具有从数据存储 rest/jsp 请求中获取的值的记录

...Extjs组合框显示具有从数据存储rest/jsp请求中获取的值的记录【英文标题】:Extjscomboboxtodisplayrecordswithvaluefetchedfromdatastorerest/jsprequest【发布时间】:2021-06-2216:43:29【问题描述】:ExtJs(4.2)版本,想知道如何从组合框下拉列表中过滤... 查看详情

如何将数字数组从bash传递到csh

...编程;很多人显然早在SunOS/Solaris时代就学会了使用csh,尽管linux/bash过渡并且尽管后者具有(恕我直言)优势,但他们并没有放弃。其次,如果这是一个常见问题解答,我深 查看详情

尽管我们在父组件中更改了两次属性的值,但 ngOnChanges 没有被调用两次

】尽管我们在父组件中更改了两次属性的值,但ngOnChanges没有被调用两次【英文标题】:ngOnChangesnotgettingcalledtwicealthoughwearechangingthevalueofpropertytwiceinparentcomponent【发布时间】:2020-01-3113:19:38【问题描述】:有两个组件,即ParentComp... 查看详情

如何将 RSK 代币余额转换为 Javascript 数字?

】如何将RSK代币余额转换为Javascript数字?【英文标题】:HowtoconvertRSKtokenbalancetoaJavascriptnumber?【发布时间】:2021-08-2515:25:11【问题描述】:我想从代币智能合约中获取余额(代币数量)。我正在使用web3.js与合约进行交互,并且... 查看详情

使用 python,我如何从 csv 中获取唯一行,但获取合并了哪些行(或行中的值)的记录?

...csv中获取唯一行,但获取合并了哪些行(或行中的值)的记录?【英文标题】:Usingpython,howdoIgettheuniquerowsfromacsv,butgetarecordofwhichrows(orvaluefromarow)werecombined?【发布时间】:2021-06-0409:15:39【问题描述】:我有一个包含11列数据的CSV文... 查看详情

当我使用 javascript 在 html 中获取 p-tag 的值时,我尝试向该值添加一个特定的数字,但输出给出 NaN

】当我使用javascript在html中获取p-tag的值时,我尝试向该值添加一个特定的数字,但输出给出NaN【英文标题】:Whenigetthevalueofap-taginhtmlusingjavascript,Itrytoaddtothisvalueaspecificnumber,buttheoutputgivesNaN【发布时间】:2019-08-2805:27:10【问题描... 查看详情

JavaScript 数组从数字到字符排序

】JavaScript数组从数字到字符排序【英文标题】:JavaScriptArraySortingfromNumberstoCharacters【发布时间】:2021-04-2118:55:35【问题描述】:这些都是我存储在一个数组中的标签,这些标签以Type_作为前缀我的数组有多种类型的值,但我无法... 查看详情

为啥尽管输入的值确实发生了变化,但 jquery 更改事件却没有触发? [复制]

】为啥尽管输入的值确实发生了变化,但jquery更改事件却没有触发?[复制]【英文标题】:whydoesthejquerychangeeventnottriggerthoughthevalueofinputchangedindeedly?[duplicate]为什么尽管输入的值确实发生了变化,但jquery更改事件却没有触发?[复... 查看详情

尽管具有正确的 DTO,但无法使用请求的结果类型为具有多个返回的查询创建 TypedQuery

】尽管具有正确的DTO,但无法使用请求的结果类型为具有多个返回的查询创建TypedQuery【英文标题】:CannotcreateTypedQueryforquerywithmorethanonereturnusingrequestedresulttype,despitehavingcorrectDTO【发布时间】:2021-12-2407:34:56【问题描述】:我已... 查看详情

尽管存在相关索引,但 PostgreSQL 查询速度很慢

】尽管存在相关索引,但PostgreSQL查询速度很慢【英文标题】:Despitetheexistenceofrelevantindices,PostgreSQLqueryisslow【发布时间】:2021-11-1510:07:20【问题描述】:我有一个包含3列的表格:时间(时间戳)价格(数字(8,2))set_id(int)该表... 查看详情

如何使用 filter()、map() 处理数组的值? JavaScript

】如何使用filter()、map()处理数组的值?JavaScript【英文标题】:Howtousefilter(),map()toworkwithvaluesfoanarray?JavaScript【发布时间】:2022-01-2110:02:45【问题描述】:我的任务是:实现函数duplicateStudents(),获取变量“学生”和具有相同预科... 查看详情

尽管公式编码正确,但 Point 类中的距离函数未返回正确的值

】尽管公式编码正确,但Point类中的距离函数未返回正确的值【英文标题】:DistancefunctioninPointclassisnotreturningthecorrectvaluedespitetheformulabeingcodedproperly【发布时间】:2020-07-0417:13:10【问题描述】:#include<iostream>#include<string>#... 查看详情

JavaScript 中前导零的数字

】JavaScript中前导零的数字【英文标题】:NumberwithleadingzeroinJavaScript【发布时间】:2022-01-1004:36:52【问题描述】:试试这个:varnum=040;console.log(num);//32从什么时候开始40=32?【问题讨论】:WorkaroundsforJavaScriptparseIntoctalbug的可能重复... 查看详情

尽管有两个水平,但对比只能应用于具有两个或更多水平的因素[重复]

】尽管有两个水平,但对比只能应用于具有两个或更多水平的因素[重复]【英文标题】:contrastscanbeappliedonlytofactorswith2ormorelevelsinspiteofhavingtwolevels[duplicate]【发布时间】:2015-07-2317:33:36【问题描述】:我正在尝试线性回归并观察... 查看详情