JavaScript:根据相等的值将数组拆分为组(数组的数组)

3

我正在尝试完成这个练习:

挑战是实现一个函数,将数组中所有连续的数字加在一起,并将它们推入一个新的数组中。例如: 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 到一个临时变量中,如果下一个数字不同,则将其推送,但没有成功。

有什么好的方法可以实现这一点吗?


4
你希望我们帮你做作业吗?并且,请分享你的代码。我们会帮你修复错误,但我们不是你的代码工厂。 - Randy
请将代码带到工作室。 - webdeb
@Randy 不是的。我问的是“如何实现这个”,而不是让你替我写出来。无论如何,代码即将到来。 - WillKre
你只需要一个for循环来完成这个任务。 - webdeb
2
var reducer = a => a.reduce((p,c,i,a) => (i === 0 ? p[0] = c : c == a[i-1] ? p[p.length-1] += c : p[p.length] = c,p),[]) - Redu
显示剩余4条评论
7个回答

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


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)


@Kreitzo,我其实不太明白你是想计算重复的数字实例还是它们的总和。如果你想改变当前的行为,请查看第4行。 - maioman

1
我喜欢挑战,所以我将其制作成了一个两步函数,你认为它很有用。
  • 第一个 reduce 创建了数组的数组

  • 第二个 reduce 对它们求和。

这不是最短的代码,但我希望它最易懂。

const arr = [1,1,2,1,1,1,1,2,1,1,1];
let currentNumber = undefined;
let currentTempArr = [];

let newArr = arr.reduce((tempArr, value) => {
  // check if current number is set
  if(currentNumber == undefined) currentNumber = value;
  
  // if current number then push to temp array
  if(currentNumber == value)
    currentTempArr.push(value);
  // else just create a new array and push the old one into the parent array
  else {
    tempArr.push(currentTempArr);
    currentTempArr = [];
    currentNumber = value;
    currentTempArr.push(value);
  }
  
  // return the array back to the next reduce iteration
  return tempArr;
}, []);

// push the last temp array, because the function stops before the push
newArr.push(currentTempArr);

// this build your array of arrays
console.info('The array of arrays');
console.log(newArr); // [ [1,1,1], [2], ... ]

// now sum up the sub arrays
let sumArr = newArr.reduce((tempArr, value) => {
  let sum = 0;
  
  // for every value in the array we add that to the sum
  value.forEach(val => sum += val);
  
  // add the total to the temp array
  tempArr.push(sum);
  
  // return the filled array back to the reduce function
  return tempArr;
}, []);

// the array with summed up values
console.info('see the magic happen');
console.log(sumArr);


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

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


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


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;
}, []);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接