如何使用javascript查找并记录数组中最长的重复数字系列

时间:2017-02-12 14:50:30

标签: javascript arrays

我的问题是我无法在数组中重复使用另一个相同数字的console.log。我可以通过此代码找到出现的次数:

var array = [2, 1, 1, 2, 3, 3, 2, 2, 2, 1],
    currentNum = 1,
    counter = 0,
    item;

for (var i = 0; i < array.length; i++) {
    for (var j = i; j < array.length; j++) {
        if (array[i] == array[j])
            counter++;
        if (currentNum < counter) {
            currentNum = counter;
            item = array[i];
        }
    }
    counter = 0;
}
console.log(item + " ( " + currentNum + " times ) ");

但我真正的问题是我想记录 2,2,2 部分而且我不知道如何。 非常感谢你们!

3 个答案:

答案 0 :(得分:2)

以下将找到最长的第一个实例(假设多个相同长度的序列)

第一个reduce()为每个序列创建子数组,第二个reduce()检查返回第一个最长序列实例的子数组的长度

var array = [2, 1, 1, 2, 3, 3, 2, 2, 2, 1];

var res = array.reduce(function(a,c,i){
  if(a.length && a[a.length-1][0] ===c){
     a[a.length-1].push(c)
  }else{
    a.push([c]);
  }  
  return a
},[]).reduce(function(a,c){
  return c.length > a.length ? c : a;
});

console.log('Sequence length=',res.length);
console.log('Value=', res[0]);

如果您期望多个相同长度的序列并且想要捕获匹配的所有值,则可以修改第二个减少类似的内容:

var array = [2, 1, 1, 2, 3, 3, 2, 2, 2, 1, 2, 2, 2, 7, 7, 7];

var res = array.reduce(function(a,c,i){
  if(a.length && a[a.length-1][0] ===c){
     a[a.length-1].push(c)
  }else{
    a.push([c]);
  }  
  return a
},[]).reduce(function(a,c){
  if(c.length > a.len){
    // reset when longer sequence found
    a.values = [c[0]];
    a.len = c.length;
  } else if(c.length === a.len){
    // add new value when same length found
    a.values.push(c[0]);
  }
  return a
},{len:0,values:[]});


console.log('Sequence length=', res.len)
console.log('How many times=', res.values.length)
console.log('Values = ', res.values.join()  )

答案 1 :(得分:0)

Array.prototype.forEach或reduce更适合迭代数组。 这是一个带有单个数组的解决方案(只有3个额外的变量:))

var array = [2, 1, 1, 2, 3, 3, 2, 2, 2, 1]

var item = array[0], maxTimes = 1, currentTimes = 1

array.reduce(function(prev, current) {
 if (prev === current) {
   currentTimes = currentTimes + 1

   if (currentTimes > maxTimes) {
     maxTimes = currentTimes
     item = current
   }
 } else {
   currentTimes = 1
 }

 return current
})

console.log(item, maxTimes)

答案 2 :(得分:0)

您可以将Array#reduce与保存临时结果和项目实际数量的对象一起使用。

如果项目等于最后一项,则递增最后一次计数并检查计数是否大于临时计数。然后临时计数被实际计数替换。

var array = [2, 1, 1, 2, 3, 3, 2, 2, 2, 1],
    count = array.reduce(function (r, a, i, aa) {
        if (a === aa[i - 1]) {
            r.last.count++;
            if (!(r.last.count <= r.result.count)) {
                r.result = r.last;
            }
        } else {
            r.last = { value: a, count: 1 };
        }
        return r;
    }, { last: {}, result: {} }).result;

console.log(count);
.as-console-wrapper { max-height: 100% !important; top: 0; }