首页 > 解决方案 > 如何递归地从数组中删除连续的重复元素?(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;
}

标签: javascriptarraysrecursion

解决方案


使用 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);


推荐阅读