连续数字javascript的总和

时间:2016-01-26 19:32:58

标签: javascript logic

给定一个整数数组。例如[1,2,2,2,5,7]。我想输出任何连续相同数字的组和它们的总和。输出应该是[1,6,5,7] ..有关如何做到的任何想法?

4 个答案:

答案 0 :(得分:3)

您可以将Array.prototype.reduce()与临时对象一起使用。

var array = [1, 2, 2, 2, 5, 7],
    result = array.reduce(function (r, a) {
        if (r.last === a) {
            r.array[r.array.length - 1] += a;
        } else {
            r.array.push(a);
            r.last = a;
        }
        return r;
    }, { array: [], last: null }).array;

document.write('<pre>' + JSON.stringify(result,0,4) + '</pre>');

答案 1 :(得分:1)

  

我这样解决了。

const sumConsecutives = (s) => {
  let result = [], temp = 0;
  for(let i = 0; i<s.length; i++) {
    if(s[i] === s[i+1]){
      temp += s[i];
    } else if(s[i] !== s[i+1]){
      result.push(temp + s[i]);
      temp = 0;
    }
  }
  return result;
};

答案 2 :(得分:0)

我们可以使用迭代来解决这个问题。代码看起来像这样

var numbers = [1, 2, 2, 2, 5, 7];
var newNumbers = [];

for (var i = 0; i < numbers.length; i++) {
    numbers = numbers.filter(function(num) {
        return num;
    });

这里我们删除了将被删除的未定义元素,因此我们不会重复组。

    var number = numbers[i];
    var nextUnique = numbers.find(function(num) {
        return num != number
    });
    var numbersToFind = numbers.indexOf(nextUnique) - i;

上面,我们正在搜索重复组中的数字数量。

    if (numbersToFind > 0) {
        var numbersGroup = numbers.slice(i, i + numbersToFind + 1);
        var sumNumbers = numbersGroup.reduce(function(num1, num2) {
            return num1 + num2;
        });
        newNumbers.push(sumNumbers);
        delete numbers[i];
    }

我们使用reduce函数来总结相同的数字。然后我们将删除原始数字以防止newNumbers数组中的重复。

    else {
        newNumbers.push(numbers[i]);
   }
}

否则,新号码将只是索引处的号码。

alert(newNumbers);

浏览器兼容性

应该注意的是array.prototype.find函数是一种实验性技术,尚未在Internet Explorer或Opera上使用。

答案 3 :(得分:0)

如果你使用lodash并想要一个功能变体,你也可以这样做:

_.chain([1,2,2,2,5,7]).groupBy(_.identity).map(_.sum).value()