首页 > 解决方案 > 我想计算数组中匹配的相邻项目并返回计数

问题描述

我有一个数组,我想找到所有相邻的匹配项并对它们进行计数,然后返回计数,在 .map() 之类的循环中执行,因此不需要存储超出当前元素计数的内存。我需要使用这个数量的当前元素为每组元素保留足够的空间

array = [ball, batter, batter, amount, amount, github, github, github, account, account, account, account, account, account, account, github, github, github]

此数组所需结果的示例是:第一个循环将返回 1,第二个循环将返回 2,然后是 2,然后是 3,然后是 7,然后是 3

并且此计数将用作保留空间的变量,例如

number to reserve: count

因此通过每个循环,变量count将被更改并更新为当前元素计数,并且计数的循环不会停止,直到下一个元素与当前元素不匹配,并且该变量count也将无法使用,直到找到所有并发匹配项,因此如果我将其放在console.log(count)函数的末尾,我将分别获得每个数字输出

标签: javascriptarraysloopssorting

解决方案


您可以轻松地将数组中的连续字符串计算为:

const array = ["ball", "batter", "batter", "amount", "amount", "github", "github", "github", "account", "account", "account", "account", "account", "account", "account", "github", "github", "github"]

const result = [];
let last = array[0], lastSameIndex = 0;
for (let i = 1; i < array.length; ++i) {
  if (array[i] !== last) {
    result.push(i - lastSameIndex);
    lastSameIndex = i;
    last = array[i];
  }
}
result.push(array.length - lastSameIndex);

console.log(result);


让我们将一些初始值声明为

last = array[0], 所以last = "ball", 和lastSameIndex = 0

所以我们必须从索引开始1,我们只需要考虑两个元素不相等的单一情况,即array[i] !== last。如果它们不相等,那么我们必须将相同元素的计数推到现在:

result.push(i - lastSameIndex);

现在,我们必须更新新的值和索引,即last我们必须再次计算该元素的元素。

lastSameIndex = i;
last = array[i];

到目前为止一切都很好,但我们还必须处理循环结束的情况,在这种情况下,我们必须从计数开始的位置(即last开始或lastSameIndex直到最后一个元素)推送最后一个元素的计数。

result.push(array.length - lastSameIndex);

Second solution

const array = [ "ball", "batter", "batter", "amount", "amount", "github", "github", "github", "account", "account", "account", "account", "account", "account", "account", "github", "github", "github"];

let lastStr = "",
  num = 0;
const result = array
  .map((s) => {
    if (lastStr !== s) {
      lastStr = s;
      num = num === 0 ? 1 : 0;
    }
    return num;
  })
  .join("")
  .match(/(\d)\1*/g)
  .map((s) => s.length);
  
console.log(result);


推荐阅读