我试图做这个练习:
挑战在于实现一个将所有内容加在一起的功能 数组中的连续数字并将它们推送到新数组中。 例如:sumConsecutives([1,1,2,1,1,1,1,2,1,1,1]);
// -> [2,2,4,2,3]
我的想法是将数组拆分为数组数组。因此,对于上面的示例:[[1,1],[2],[1,1,1,1],[2],[1,1,1]]
然后浏览reduce
。
我尝试使用while
循环和push
进入临时变量,如果下一个数字不相同则会被推送,但无济于事。
关于如何实现这一目标的任何想法?
答案 0 :(得分:3)
我能想到的最简单的方法......(不使用map / reduce)
var sumConsecutives = function(arr) {
var newArr = [];
var prev = arr[0];
var sum = arr[0];
for (var i=1; i<arr.length; i++){
if (arr[i] !== prev) {
newArr[newArr.length] = sum;
sum = 0;
}
sum += arr[i];
prev = arr[i];
}
// Add last sum
newArr[newArr.length] = sum;
return newArr;
};
console.log ( sumConsecutives([1,1,2,1,1,1,1,2,1,1,1]) );
答案 1 :(得分:2)
您可以使用一步reduce
方法:
const sumConsecutives = ar =>
ar.reduce((ac, x, i) => {
if ( i !== 0 && ar[i-1] === x)
ac[ac.length -1] += x;
else
ac.push(x);
return ac;
}, [])
var r = sumConsecutives([1,1,2,1,1,1,1,2,1,1,1]); // -> [2,2,4,2,3]
console.log(r)
&#13;
答案 2 :(得分:1)
我喜欢挑战,所以我用两段功能制作了你认为有用的功能。
第一个reduce创建数组数组
第二次减少总结了它们。
这不是最短的代码,但我希望最容易理解。
Hash Join (cost=230.47..713.98 rows=101 width=488)
Hash Cond: (t2.unique2 = t1.unique2)
-> ... (outer)
-> Hash (cost=229.20..229.20 rows=101 width=244)
-> ... (inner)
答案 3 :(得分:0)
function sumConsecutives(input) {
var output = [],
factor = 1,
lastnr = null;
for (var i = 0; i < input.length; i++) {
if (i === 0) {
lastnr = input[i];
continue;
}
if (input[i] !== lastnr) {
output.push(lastnr * factor);
lastnr = input[i];
factor = 1;
} else {
factor++;
}
if (i === (input.length - 1)) {
output.push(input[i] * factor);
}
}
return output;
}
var result = sumConsecutives([1,1,2,1,1,1,1,2,1,1,1]);
答案 4 :(得分:0)
您可以使用array.reduce
function sumConsecutives(arr) {
var r = [];
arr.reduce(function(p, c, i, a) {
if (p === c) {
r[r.length - 1] += c
} else {
r.push(c)
}
return c;
}, 0);
return r;
}
var a = [1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1];
console.log(sumConsecutives(a));
&#13;
答案 5 :(得分:0)
这是我能想到的最容易的:
var testarr = [1,1,2,1,1,1,1,2,1,1,1];
var resultarr = [testarr[0]];
for(var i=1; i<testarr.length; i++){
if(testarr[i-1]==testarr[i]){
resultarr[resultarr.length - 1] += testarr[i];
}else{
resultarr.push(testarr[i]);
}
}
console.log(resultarr);
答案 6 :(得分:0)
您也可以尝试这种方法:
var source = [1,1,2,1,1,1,1,2,1,1,1];
source.reduce(function(p, c, index, arr) {
if (p.length === 0 || arr[index - 1] !== c) {
return p.concat(c);
}
else if (arr[index - 1] === c) {
p[p.length - 1] += c
}
return p;
}, []);