【问题标题】:Replace duplicates items in array with different values用不同的值替换数组中的重复项
【发布时间】:2020-11-10 22:25:35
【问题描述】:

我想用不同的值替换重复的项目。

例如arr = [1,1,1,1,2,2,2,3] 我想用R 替换重复项

所以结果看起来像这样arr = [1,R,R,R,2,R,R,3]

现在我正在使用这种方法:

    arr = [1,1,1,1,2,2,2,3]
    let previous = 0;
    let current = 1;
    while (current < arr.length) {
        if (arr[previous] === arr[current]) {
            arr[current] = 'R';
            current += 1;
        } else if (arr[previous] !== arr[current]) {
            previous = current;
            current += 1;
        }
    }

我想知道是否有不同的方法可以实现这一目标。例如使用 Lodash (uniqwith, uniq)。

谢谢

【问题讨论】:

  • 保留你遇到的所有东西的集合或地图,当发现重复时,替换它。
  • 你想只替换直接邻域中的相同值吗?

标签: javascript arrays loops replace lodash


【解决方案1】:

您可以关闭 Set 并检查该值是否已被看到。

let array = [1, 1, 1, 1, 2, 2, 2, 3],
    result = array.map((seen => v => seen.has(v) ? 'R' : (seen.add(v), v))(new Set));

console.log(...result);

一种检查先前值的方法

let array = [1, 1, 1, 1, 2, 2, 2, 3],
    result = array.map((v, i, { [i - 1]: l }) => l === v ? 'R' : v);

console.log(...result);

【讨论】:

  • 您的解决方案很优雅,但我发现它非常非常难以阅读(即使有多年的 JavaScript 经验)。我不知道这对刚开始学习的人有多大帮助。
【解决方案2】:

这实际上很简单,通过使用集合 (Set)。

const initialArray = [1,1,1,1,2,2,2,3];
const valuesSet = new Set();

const newArray = initialArray.map((value) => {
    if (valuesSet.has(value)) {
        return 'R';
    } else {
        valuesSet.add(value);
        return value;
    }
});

【讨论】:

    【解决方案3】:

    我会这样做 它查看当前元素是否是具有当前值的数组的第一个元素,如果不是则替换它

    在非常大的数组上可能需要一些时间

    const input = [1,1,1,1,2,2,2,3]
    let output = input.map(
      (el, i) => input.indexOf(el) === i ? el : 'R'
    )
    console.log(output)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 2022-12-17
      • 1970-01-01
      • 2012-10-24
      相关资源
      最近更新 更多