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