【发布时间】:2016-05-03 12:25:06
【问题描述】:
给定一个整数数组。
例如:
[1,2,2,2,5,7]
我想输出任何一组连续相同的数字及其总和。
输出应该是:
[1,6,5,7]
关于如何做到这一点的任何想法?
【问题讨论】:
-
哦,同时你删除了你原来的问题!
标签: javascript logic
给定一个整数数组。
例如:
[1,2,2,2,5,7]
我想输出任何一组连续相同的数字及其总和。
输出应该是:
[1,6,5,7]
关于如何做到这一点的任何想法?
【问题讨论】:
标签: javascript logic
您可以将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>');
【讨论】:
我是这样解决的。
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;
};
【讨论】:
如果您使用 lodash 并想要一个功能变体,您也可以这样做:
_.chain([1,2,2,2,5,7]).groupBy(_.identity).map(_.sum).value()
【讨论】:
我们可以使用迭代来解决这个问题。代码看起来像这样
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 上尚不可用。
【讨论】:
numbers = numbers.filter(function(num) { return num; }); 为什么?这只会过滤真实的值,但为了什么?
undefined。这就是为什么我们需要在每次迭代开始时过滤真实元素
numbers.find 并非在所有用户代理上都可用...