javascript 替换数组中连续重复的值

6ss1mwsb  于 2022-12-17  发布在  Java
关注(0)|答案(2)|浏览(73)

在一个数字数组中,我需要找到重复的值并用null替换它们。
示例
如果数组中间的相邻元素也是6,则替换6

[1, 4, 3, 6, 6, 6, 6, 3, 2]   => [1, 4, 3, 6, null, null, 6, 3, 2]

如果倒数第二个值为6,则替换数组末尾的6:

[2, 6, 6, 6, 5, 2, 6, 6] => [2, 6, null, 6, 5, 2, 6, null]

如果下一个值为6,则替换数组开头的6

[6, 6, 2, 3, 5, 6] => [null, 6, 2, 3, 5, 6]

有什么想法如何实现这一点吗?如果需要,我愿意使用长划线/下划线

goucqfw6

goucqfw61#

您必须迭代数组并检查您提到的情况。

  • 检查第一元素是否等于第二元素
  • 检查最后一个元素是否等于倒数第二个元素
  • 检查元素是否等于任一相邻元素

下面的代码应该可以实现您的要求。

function replaceRepeats(arr) {
  for (let i = 0; i < arr.length; i++) {
    if (i === 0) {
      if (arr[i] === arr[i + 1]) {
        arr[i] = null;
      }
    } else if (i === arr.length - 1) {
      if (arr[i] === arr[i - 1]) {
        arr[i] = null;
      }
    } else {
      if (arr[i] === arr[i - 1] || arr[i] === arr[i + 1]) {
        arr[i] = null;
      }
    }
  }
  return arr;
}
toiithl6

toiithl62#

您可以使用map,以便在替换以下内容时能够访问原始数组:

const maskDupes = arr =>
    arr.map((val, i, arr) =>
        (arr[i-1]??val) == val && (arr[i+1]??val) == val ? null : val
    );

console.log(...maskDupes([1, 4, 3, 6, 6, 6, 6, 3, 2]));
console.log(...maskDupes([2, 6, 6, 6, 5, 2, 6, 6]));
console.log(...maskDupes([6, 6, 2, 3, 5, 6]));

或者,如果数组应该被改变,你可以跟踪必须被比较的当前值,这样即使在数组中它被替换为null,你仍然可以使用它:

const maskDupes = arr => {
    for (let i = 0, prev = arr[0]; i < arr.length; i++) {
        if (prev == arr[i] && arr[i] == (arr[i+1]??prev)) arr[i] = null;
        else prev = arr[i];
    }
}

let arr = [1, 4, 3, 6, 6, 6, 6, 3, 2];
maskDupes(arr);
console.log(...arr);

arr = [2, 6, 6, 6, 5, 2, 6, 6];
maskDupes(arr);
console.log(...arr);

arr = [6, 6, 2, 3, 5, 6];
maskDupes(arr);
console.log(...arr);

相关问题