JavaScript:基于相等的值将数组拆分为组(数组数组)

时间:2016-08-09 08:41:19

标签: javascript arrays

我试图做这个练习:

  

挑战在于实现一个将所有内容加在一起的功能   数组中的连续数字并将它们推送到新数组中。   例如: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进入临时变量,如果下一个数字不相同则会被推送,但无济于事。

关于如何实现这一目标的任何想法?

7 个答案:

答案 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方法:

&#13;
&#13;
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;
&#13;
&#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

逻辑

  • 创建临时数组。
  • 循环数组并检查先前和当前值。
  • 如果相同,请获取临时数组的最后一个元素并为其添加当前值。
  • 如果没有,请将当前元素推送到临时数组

示例

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