javascript - 如何递归地从数组中删除连续的重复元素?(javascript)
问题描述
我正在尝试创建一个旨在以递归方式消除数组中任何连续重复元素的函数。它适用于全局变量,但是,我发现解决方法相当薄弱。我的代码基于此代码(从字符串中删除所有连续的重复项;使用的语言:C++)。我了解字符串和数组之间存在可变性差异,但我并不完全了解后台堆栈发生的情况。一旦函数运行,全局变量是正确的,但函数本身的输出却不是。任何解释或方向将不胜感激。谢谢!
这不是一个家庭作业问题,我只是想将递归锤入我的头骨,因为它仍然让我陷入循环。对不起双关语。
//var testArr = [1, 1, 2, 2, 3, 3, 1, 1, 1]
//compress(testArr); //[1,2,3,1] //<= expected result
//current output [1, 2, 2, 3, 3, 1, 1, 1]
var arr = [];
var compress = function(list) {
//var arr = [];
if (list.length === 0) {
return arr;
}
if (list.length === 1) {
arr.push(list[0]);
return list
}
if (list.length > 1 && list[0] !== list[1]) {
arr.push(list[0])
compress(list.slice(1,));
}
if (list.length > 1 && list[0] === list[1]) {
list.splice(0,1);
compress(list);
}
return list;
}
解决方案
使用 ECMAScript 6 功能:
const testArr = [1, 1, 2, 2, 3, 3, 1, 1, 1];
const compress = ([head, ...rest]) => {
if (!head) return [];
const tail = compress(rest);
return head === tail[0] ? tail : [head, ...tail];
}
console.log(compress(testArr));
作为旁注,我想指出功能方法有点短(是的,我知道问题是关于递归方法):
const testArr = [1, 1, 2, 2, 3, 3, 1, 1, 1];
const output = testArr.reduce((list, next) => list.slice(-1)[0] === next ? list : [...list, next], []);
console.log(output);
推荐阅读
- python - 如何在python中打开json文件
- java - 遇到 OutOfMemoryException 时删除 List<> 的一部分
- android - 如何在 as3 上实现运行时权限?
- reactjs - 如何将 DayPicker 链接到现有的输入元素
- javascript - pm2 autostart discord.js bot 在重新启动时不会再次连接(树莓派)
- php - PHP PDO 错误 [调用未定义的方法 PDOStatement]
- angular - 将 JSON 响应分配给 mat-autocomplete
- sql-server - 没有 SQL Server 名称
- javascript - 使用 Node Js 控制时间并每秒发送查询?
- node.js - 测试失败后不运行 Jest globalTeardown