【问题标题】:changing my array while iterating over it (Javascript)在迭代时更改我的数组(Javascript)
【发布时间】:2020-07-21 12:12:02
【问题描述】:

抱歉,我之前写的问题有点仓促,所以无法用正确的例子正确表达。

下面的问题已经出现了很多次,我总是卡住。我对 Javascript 的了解只是初级水平。

我希望我的数组列表在迭代时发生变异和变化。 本质上,迭代从第一次迭代获得的全新数组。

arr = [ 1, 2, 1, 3, 4, 2, 4, 1, 2, 4 ]

if arr[n]== 1 and arr[n+1] == 2 || arr[n] == 3 || arr[n+1] == 4
then remove arr[n] and arr[n+1] and current index is +2 else
newarr.push[n] and current index is +1
Loop over

上述循环运行后,我们得到:

newarr = [1, 2, 4, 4];

现在循环以相同的条件遍历这个新数组。我们得到

newarr = [4,4];

现在由于条件不能满足,我们跳出循环。

希望这更清楚。我已经尝试了一切,但循环总是引用原始数组,我只是不知道如何让它使用结果数组。这是可以通过递归或reduce方法完成的吗?

感谢任何建议。谢谢。

【问题讨论】:

  • StackOverflow 不是免费的编码服务。你应该try to solve the problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :)
  • 在迭代数组时要小心从数组中删除元素。以下所有元素的索引将向下移动,这可能导致您的迭代跳过元素。通常最好从结尾而不是开头进行迭代。
  • 为什么2, 15, 6, 7 转向2, 21, 7?您的规则没有修改任何值对吗?
  • @KentaNomoto 你是对的。我的例子不是更清楚。我已经更新了我的问题,请看一下。规则确实会修改该值。循环应始终使用上一次迭代的结果数组。

标签: javascript arrays loops iteration mutation


【解决方案1】:

你可以使用递归。

每次调用change_array() 时,都会将要修改的数组作为参数传递。

第一次调用此函数时,您会提供原始数组。 此函数创建一个新数组,从旧数组中获取所需的元素,并以新数组作为参数再次调用自身。此过程一直持续到不再对数组进行修改为止。

当你有一个递归函数时,你还应该有一个停止递归的条件,以避免无限调用和堆栈溢出。

在这个特定的例子中,如果没有对数组进行修改,因为根据我们的标准没有找到匹配的元素,我们在这一行停止递归

if(!found_element){ return false;}

这是完整的代码

var original_arr = [ 1, 2, 1, 3, 4, 2, 4, 1, 2, 4 ];
change_array(original_arr);

function change_array(arr){

var temp_array=[];
var found_element=false;

console.log(arr);

for(let i=0;i<arr.length;i++){

    if((arr[i]==1 && arr[i+1]==2 )|| (arr[i]==3 && arr[i+1]==4)){
        found_element=true;
        i++;
    }else{
        temp_array.push(arr[i]);
    }
}

if(!found_element){ return false;}

change_array(temp_array);

}

执行时返回

[1, 2, 1, 3, 4, 2, 4, 1, 2, 4]
[1, 2, 4, 4]
[4, 4]

【讨论】:

  • 感谢您的回复。我确实考虑过递归。我了解递归背后的逻辑,但它的实际应用胜过我。我今天肯定会采用并实施您的解决方案并回来。同时,如果您有时间,请检查一下刚才更新的问题。再次感谢。
  • @amars 我根据你修改的问题修改了我的代码。记住基本原理和以前一样。
  • 它的工作方式以及您使用布尔值的方式以及找到匹配项时将 i 递增两次的方式都很漂亮和崇高。不过只是一个问题。当 if(!found_element){ return false;} 返回 false。前一个函数如何从这一行接收布尔值?这个布尔值去哪里了?
  • @amars 在这个例子中我们使用return false; 只是为了停止递归。它不是真的需要。我只是认为它会更容易理解。你可以用if(found_element){ change_array(temp_array); } 替换并且会工作相同,因为默认情况下,如果您省略返回,它将返回未定义。所以在我的回答中,返回 false 在最后一次调用中仅返回一次。您可以查看此答案以获取有关主题 stackoverflow.com/questions/50732969/… 的更多信息
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 2020-04-12
  • 2015-03-14
  • 1970-01-01
  • 2013-04-03
相关资源
最近更新 更多