Новый массив из массива с условием… - PullRequest
1 голос
/ 13 июля 2020

Я хочу преобразовать:

a = [0.25, 0.375, 0.5, 0.5, 0.5]

В:


a2 = [
       [0.25, 0.375],
       [0.5, 0.5],
       [0.5]
     ]

- где сумма каждой строки элементов массива <= 1 </p>

Я думаю, некоторые нарезки , сокращение лечения подойдет, но я просто не знаю, куда вставить условие… Любая помощь?

Ответы [ 3 ]

4 голосов
/ 13 июля 2020

const a = [0.25, 0.375, 0.5, 0.5, 0.5];

const result = a.reduce(
    (acc, val) => {
        const last = acc[acc.length - 1];

        if (last.reduce((a, v) => a + v, 0) + val <= 1) {
            last.push(val);
        } else {
            acc.push([val]);
        }

        return acc;
    },
    [[]],
);

console.log(result);
3 голосов
/ 13 июля 2020

Вы можете уменьшить массив, используя функцию ограничения.

const
    add = (a, b) => a + b,
    constraint = sum => sum <= 1,
    array = [0.25, 0.375, 0.5, 0.5, 0.5],
    result = array.reduce((r, v) => {
        let last =  r[r.length - 1];
        if (!last || !constraint(last.reduce(add) + v)) r.push(last = []);
        last.push(v);
        return r;
    }, []);

console.log(result);
1 голос
/ 13 июля 2020
var s = 0;
var start = 0;
var a2 = [];
for (var i = 0; i<a.length; i++) {
   if (s+a[i] <= 1) {
       s+=a[i];
   }
   else {
      if (i == start) {
         a2.push(a.slice(i,i);
      }
      else {
         a2.push(a.slice(start, i-1);
      }
      s = a[i]
      start = i;
   }
}
...