【问题标题】:How to prevent an array from repeating elements consecutively?如何防止数组连续重复元素?
【发布时间】:2020-04-16 01:06:59
【问题描述】:

很快,这就是我想要的:

    arr=[a, b, c, d, e, f]

    arr=[a, b, a, b, c, d, c, e, a, b]

它们不必按顺序排列。

当:

    arr=[a, a, b, c, d, d, e, f]

谢谢。

【问题讨论】:

  • 现在你想要什么??
  • 我希望每个下一个元素都与前一个元素不同,尽管它们可以重复,但不能彼此相邻。我认为这些例子很清楚......
  • 这真的是那个问题的重复吗???
  • @tsh 我也不这么认为。 OP 不想“混淆”数组,他们想检查连续重复并返回一个布尔值。为什么有些人的扳机手指这么快?
  • 也许a => a.every((n, i) => i === 0 || n !== a[i - 1])

标签: javascript arrays duplicates


【解决方案1】:

您可以使用Array.prototype.every 来测试数组中的所有元素是否通过测试(即返回布尔值的回调函数)。在这种情况下,请确保当前检查的元素与前一个元素 (index - 1) 不同,忽略第一个元素 (!index)。

var arr1 = ["a", "b", "c", "d", "e", "f"];
var arr2 = ["a", "a", "b", "c", "d", "d", "e", "f"];

function arrayHasConsecitiveRepetition(arrayIn) {
  return arrayIn.every(function(element, index) {
      return !index || element !== arrayIn[index - 1];
  });
}

console.log(arrayHasConsecitiveRepetition(arr1)); // true
console.log(arrayHasConsecitiveRepetition(arr2)); // false

当然你也可以反过来做,使用Array.prototype.some检查是否至少有一个元素匹配条件,这实际上可能在性能方面更好,因为一旦条件停止评估是真的*:

var arr1 = ["a", "b", "c", "d", "e", "f"];
var arr2 = ["a", "a", "b", "c", "d", "d", "e", "f"];

function arrayHasConsecitiveRepetition(arrayIn) {
  return !arrayIn.some(function(element, index) {
      return index && element === arrayIn[index - 1];
  });
}

console.log(arrayHasConsecitiveRepetition(arr1)); // true
console.log(arrayHasConsecitiveRepetition(arr2)); // false

*实际上,一旦条件满足(不),这两种方法都会立即返回,因此与其说是性能问题,不如说是品味或风格问题。在这种情况下,我更愿意使用第一种方法,因为它对我来说更清楚。

来自 MDN 页面:

如果找到这样的元素,every 方法会立即返回false

如果找到这样的元素,some() 立即返回true

【讨论】:

  • “在性能方面实际上可能更好,因为一旦条件为真,它就会停止评估”Array#every 不会在条件为假时停止评估吗?
  • 这确实是个好问题,我没想到。事实证明你是对的:If such an element is found, the every method immediately returns false.!所以我想这根本不是性能问题,而是品味问题。
  • 更新了解决该问题的答案
  • 所以 .some 和 .every 可以节省创建 if.. else 的时间?正确的?我是新手,所以我试图理解我在阅读和打字的内容......另外,如果你不介意,为什么莫妮卡的答案不起作用?这是我想到的第一件事......谢谢
  • 它有助于缩短代码。您还可以遍历数组元素并使用 if/else 进行检查,是的。
【解决方案2】:

一个选项:

const arr1 = ['a', 'b', 'c', 'd', 'e', 'f'];
const arr2 = ['a', 'a', 'b', 'c', 'd', 'd', 'e', 'f'];

function checkArr(arr) {
  let previous;

  const check = !arr.some(letter => {
      if (letter === previous) {
          return true;
      }

      previous = letter;
  });

  console.log(check);
}

checkArr(arr1); // true
checkArr(arr2); // false

【讨论】:

  • 注意,当第一个元素是undefined时,即使第二个元素不是undefined,它也会返回false。你可能想检查previous && letter === previous
猜你喜欢
  • 1970-01-01
  • 2020-12-06
  • 2019-01-11
  • 1970-01-01
  • 2018-05-03
  • 2013-12-23
  • 2011-02-06
  • 2018-10-29
  • 1970-01-01
相关资源
最近更新 更多