如何使用Javascript计算数组中的相邻数字?

sto*_*036 10 javascript arrays sorting foreach arraylist

我的输入是一个像这样的数组:

[7, 7, 7, 7, 4, 4, 5, 5, 5, 1, 9, 2, 7, 7]

我想将数字组合在一起并添加它们,但按邻居,而不是按数组中的总数。所以输出将是:

['7:4', '4:2', '5:3', 1, 9, 2, '7:2']

我尝试了几种不同的方法,使用reduce, 并接近但使用内置的 Javascript 方法我最终计算了数组中的 ALL,而不是邻居。

const firstArray = [7, 7, 7, 7, 4, 4, 5, 5, 5, 1, 9, 2, 7, 7];
const masterArray = [];

const unique = new Set (numberArray); // Set {7, 4, 5, 1, 9, 2, 7}
unique.forEach(u => {
  masterArray.push(numberArray.filter(e => e === u));
});

console.log(masterArray);
Run Code Online (Sandbox Code Playgroud)

在这里使用 Set 显然是错误的,因为它会获取唯一值并对其进行计数,但我只想通过邻居来完成。那么我想我应该使用 areduce但我遇到了同样的问题。

Tap*_*lar 3

var test = [7, 7, 7, 7, 4, 4, 5, 5, 5, 1, 9, 2, 7, 7];

console.log(
  test.reduce((acc, element) => {
    if (acc.length && acc[acc.length - 1].key == element) {
      acc[acc.length - 1].count++;
    } else {
      acc.push({ key: element, count: 1 });
    }
    
    return acc;
  }, []).map(element => `${element.key}:${element.count}`)
);
Run Code Online (Sandbox Code Playgroud)

因此,逻辑首先将数字减少为数组,跟踪最后一个键和计数。只要密钥相同,计数就会递增。一旦密钥发生变化,就会推送一个新对象来开始下一次运行。完成归约后,将执行映射以将键和计数转换为所需的字符串。