J'ai un tableau d'objets, j'ai besoin de diviser ce tableau en plusieurs tableaux. Si la somme du nombre d'éléments <= 500, retournez ces objets dans un tableau.

const array = [{idx: 1, count: 100}, {idx: 2, count: 200}, {idx: 3, count: 200}, {idx: 4, count: 100}]

//Expected Result: array of arrays
// [[{idx: 1, count: 100}, {idx: 2, count: 200}, {idx: 3, count: 200}], [{idx: 4, count: 100}]]
0
itwaze 8 avril 2020 à 13:35

4 réponses

Meilleure réponse

Vous pouvez simplement le faire en utilisant réduire:

const array = [{idx: 1, count: 100}, {idx: 2, count: 200}, {idx: 3, count: 200}, {idx: 4, count: 100}]

const result = array.reduce((carry, item) => {
    if (!carry.array.length || carry.count + item.count > 500) {
        carry.array.push([item]);
        carry.count = item.count;
    } else {
         carry.array[carry.array.length - 1].push(item);
         carry.count += item.count;
    }
    
    return carry;
}, {array: [], count: 0}).array;

console.log(result);
1
Matei Mihai 8 avril 2020 à 10:57

Vous pouvez utiliser forEach pour parcourir le tableau et avoir deux variables distinctes. Un pour le tableau de résultats et un autre pour contenir la somme de count

const array = [{idx: 1, count: 100}, {idx: 2, count: 200}, {idx: 3, count: 200}, {idx: 4, count: 100}]

const res = [[]]; //initialize the result array with initial subarray
let count = 0; //initialize the count to zero
//Loop through the elements of array.
array.forEach(x => {
  res[res.length - 1].push(x); //Add the the current element to the last sub array
  count += x.count //increase the temporary count  
  //if count exceeds 500
  if(count >= 500){
    //add another sub array to the end of final array
    res.push([]);
    //Reset the count to 0 
    count = 0;
  }
});
console.log(res);
0
Maheer Ali 8 avril 2020 à 10:40

Cela peut être résolu assez élégamment avec des générateurs:

 function* groupTill(arr, predicate) {
   let acc = [], pred = predicate();
   for(const el of arr) {
     if(!pred(el)) {
       yield acc; acc = []; pred = predicate();
     }
     acc.push(el);
   }
   yield acc;
 }

 const result = [...groupTill(input, (total = 0) => ({ count }) => (total += count)  < 500)];
1
Jonas Wilms 8 avril 2020 à 10:46

Vous pouvez utiliser reduce avec des indicateurs (ceux-ci sont utilisés pour suivre si nous devons augmenter l'index ou non)

const array = [{idx: 1, count: 100}, {idx: 2, count: 200}, {idx: 3, count: 200}, {idx: 4, count: 100}]

let splitter = (arr) => {
  let index = 0,
    total = 0
  return arr.reduce((op, inp) => {
    if ((total + inp.count) > 500) {
      index++;
      total = 0;
    }
    total += inp.count
    op[index] = op[index] || []
    op[index].push(inp)
    return op
  }, [])
}

console.log(splitter(array))
0
Code Maniac 8 avril 2020 à 10:43