连续数字之和 JavaScript
Posted
技术标签:
【中文标题】连续数字之和 JavaScript【英文标题】:Sum of consecutive numbers JavaScript 【发布时间】:2016-05-03 12:25:06 【问题描述】:给定一个整数数组。
例如:
[1,2,2,2,5,7]
我想输出任何一组连续相同的数字及其总和。
输出应该是:
[1,6,5,7]
关于如何做到这一点的任何想法?
【问题讨论】:
在***.com/a/9229821/1169519上应用代码 哦,同时你删除了你原来的问题! 【参考方案1】:您可以将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>');
【讨论】:
【参考方案2】:我是这样解决的。
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;
;
【讨论】:
【参考方案3】:如果您使用 lodash 并想要一个功能变体,您也可以这样做:
_.chain([1,2,2,2,5,7]).groupBy(_.identity).map(_.sum).value()
【讨论】:
【参考方案4】:我们可以使用迭代来解决这个问题。代码看起来像这样
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; );
为什么?这只会过滤真实的值,但为了什么?
正如我所解释的,为了避免迭代重复的元素,在我执行了 reduce 操作后,我将删除该索引处的元素。这使得元素显示为undefined
。这就是为什么我们需要在每次迭代开始时过滤真实元素
也许您应该声明,numbers.find
并非在所有用户代理上都可用...以上是关于连续数字之和 JavaScript的主要内容,如果未能解决你的问题,请参考以下文章