Sum of consecutive javascript numbers

For an array of integers. For example [1,2,2,2,5,7]. I want to print any groups of consecutive identical numbers with their sum. The output should be [1,6,5,7] .. Any thoughts on how to do this?

+4
source share
4 answers

You can use Array.prototype.reduce()with a temporary object.

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>');
Run codeHide result
+3
source

We could solve this using iteration. The code will look something like this:

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;
    });

Here we delete elements that are undefined deleted, so we do not repeat the groups.

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

Above, we look for the number of numbers in a repeating group.

    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.

0

If you use lodash and want a functional option, you can also:

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

I decided it like that.

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;
};
0
source

Source: https://habr.com/ru/post/1626053/


All Articles