массив массива sum и breaks при выполнении условия if - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть такой массив js.

const test_arr = [ [ 20, 7, 23, 19, 10, 15, 25 ],
 [ 20, 7, 23, 19, 10, 15, 8 ],
  [ 20, 7, 23, 19, 10, 15, 13 ],
  [ 20, 7, 23, 19, 10, 25, 8 ],
  [ 20, 7, 23, 19, 10, 25, 13 ],
  [ 20, 7, 23, 19, 10, 8, 13 ],
  [ 20, 7, 23, 19, 15, 25, 8 ],
  [ 20, 7, 23, 19, 15, 25, 13 ],
  [ 20, 7, 23, 19, 15, 8, 13 ],
  [ 20, 7, 23, 19, 25, 8, 13 ],
  [ 20, 7, 23, 10, 15, 25, 8 ],
  [ 20, 7, 23, 10, 15, 25, 13 ],
  [ 20, 7, 23, 10, 15, 8, 13 ],
  [ 20, 7, 23, 10, 25, 8, 13 ],
  [ 20, 7, 23, 15, 25, 8, 13 ],
  [ 20, 7, 19, 10, 15, 25, 8 ],
  [ 20, 7, 19, 10, 15, 25, 13 ],
  [ 20, 7, 19, 10, 15, 8, 13 ],
  [ 20, 7, 19, 10, 25, 8, 13 ],
  [ 20, 7, 19, 15, 25, 8, 13 ],
  [ 20, 7, 10, 15, 25, 8, 13 ],
  [ 20, 23, 19, 10, 15, 25, 8 ],
  [ 20, 23, 19, 10, 15, 25, 13 ],
  [ 20, 23, 19, 10, 15, 8, 13 ],
  [ 20, 23, 19, 10, 25, 8, 13 ],
  [ 20, 23, 19, 15, 25, 8, 13 ],
  [ 20, 23, 10, 15, 25, 8, 13 ],
  [ 20, 19, 10, 15, 25, 8, 13 ],
  [ 7, 23, 19, 10, 15, 25, 8 ],
  [ 7, 23, 19, 10, 15, 25, 13 ],
  [ 7, 23, 19, 10, 15, 8, 13 ],
  [ 7, 23, 19, 10, 25, 8, 13 ],
  [ 7, 23, 19, 15, 25, 8, 13 ],
  [ 7, 23, 10, 15, 25, 8, 13 ],
  [ 7, 19, 10, 15, 25, 8, 13 ],
  [ 23, 19, 10, 15, 25, 8, 13 ] ]

var combination_before = [ 20,7,23, 19, 10, 15, 25, 8, 13 ]; Это результаты выбора семи из девяти.

Я бы хотел вернуть некоторые элементы, только когда сумма элементов равна 100.

как мне сделать редуктор, если условие?

Ответы [ 3 ]

0 голосов
/ 12 ноября 2018

const test_arr = [ [ 20, 7, 23, 19, 10, 15, 25 ],
 [ 20, 7, 23, 19, 10, 15, 8 ],
  [ 20, 7, 23, 19, 10, 15, 13 ],
  [ 20, 7, 23, 19, 10, 25, 8 ],
  [ 20, 7, 23, 19, 10, 25, 13 ],
  [ 20, 7, 23, 19, 10, 8, 13 ],
  [ 20, 7, 23, 19, 15, 25, 8 ],
  [ 20, 7, 23, 19, 15, 25, 13 ],
  [ 20, 7, 23, 19, 15, 8, 13 ],
  [ 20, 7, 23, 19, 25, 8, 13 ],
  [ 20, 7, 23, 10, 15, 25, 8 ],
  [ 20, 7, 23, 10, 15, 25, 13 ],
  [ 20, 7, 23, 10, 15, 8, 13 ],
  [ 20, 7, 23, 10, 25, 8, 13 ],
  [ 20, 7, 23, 15, 25, 8, 13 ],
  [ 20, 7, 19, 10, 15, 25, 8 ],
  [ 20, 7, 19, 10, 15, 25, 13 ],
  [ 20, 7, 19, 10, 15, 8, 13 ],
  [ 20, 7, 19, 10, 25, 8, 13 ],
  [ 20, 7, 19, 15, 25, 8, 13 ],
  [ 20, 7, 10, 15, 25, 8, 13 ],
  [ 20, 23, 19, 10, 15, 25, 8 ],
  [ 20, 23, 19, 10, 15, 25, 13 ],
  [ 20, 23, 19, 10, 15, 8, 13 ],
  [ 20, 23, 19, 10, 25, 8, 13 ],
  [ 20, 23, 19, 15, 25, 8, 13 ],
  [ 20, 23, 10, 15, 25, 8, 13 ],
  [ 20, 19, 10, 15, 25, 8, 13 ],
  [ 7, 23, 19, 10, 15, 25, 8 ],
  [ 7, 23, 19, 10, 15, 25, 13 ],
  [ 7, 23, 19, 10, 15, 8, 13 ],
  [ 7, 23, 19, 10, 25, 8, 13 ],
  [ 7, 23, 19, 15, 25, 8, 13 ],
  [ 7, 23, 10, 15, 25, 8, 13 ],
  [ 7, 19, 10, 15, 25, 8, 13 ],
  [ 23, 19, 10, 15, 25, 8, 13 ] ];
  
  var resultArr = [];
  
  for (var i = 0; i < test_arr.length; i++){
  temp = test_arr[i].reduce(getSum)
    if (temp == 100) {
    resultArr.push(test_arr[i]);
  }
  }
  
  function getSum(total, num) {
    return total + num;
}
  
  
  console.log(resultArr)
0 голосов
/ 12 ноября 2018

В данный момент вы можете использовать другой подход, когда вы берете все комбинации и возвращаете только тех, кто соответствует условиям по длине и сумме.

function getCombinations(array, length, sum) {
    function iter(array, temp) {
        if (temp.length === length) {
            if (temp.reduce((a, b) => a + b) === sum) {
                result.push(temp);
            }
            return;
        }
        if (!array.length || array.length + temp.length < length) {
            return;
        }
        iter(array.slice(1), temp.concat(array[0]));
        iter(array.slice(1), temp);
    }

    var result = [];    
    iter(array, []);
    return result;
}

var array = [20, 7, 23, 19, 10, 15, 25, 8, 13];

console.log(getCombinations(array, 7, 100));
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 12 ноября 2018

вы можете использовать filter для фильтрации вашего массива и reduce для суммирования вложенных массивов, а также проверить в вашем фильтре, какая сумма массива равна 100

const test_arr = [ [ 20, 7, 23, 19, 10, 15, 25 ],
 [ 20, 7, 23, 19, 10, 15, 8 ],
  [ 20, 7, 23, 19, 10, 15, 13 ],
  [ 20, 7, 23, 19, 10, 25, 8 ],
  [ 20, 7, 23, 19, 10, 25, 13 ],
  [ 20, 7, 23, 19, 10, 8, 13 ],
  [ 20, 7, 23, 19, 15, 25, 8 ],
  [ 20, 7, 23, 19, 15, 25, 13 ],
  [ 20, 7, 23, 19, 15, 8, 13 ],
  [ 20, 7, 23, 19, 25, 8, 13 ],
  [ 20, 7, 23, 10, 15, 25, 8 ],
  [ 20, 7, 23, 10, 15, 25, 13 ],
  [ 20, 7, 23, 10, 15, 8, 13 ],
  [ 20, 7, 23, 10, 25, 8, 13 ],
  [ 20, 7, 23, 15, 25, 8, 13 ],
  [ 20, 7, 19, 10, 15, 25, 8 ],
  [ 20, 7, 19, 10, 15, 25, 13 ],
  [ 20, 7, 19, 10, 15, 8, 13 ],
  [ 20, 7, 19, 10, 25, 8, 13 ],
  [ 20, 7, 19, 15, 25, 8, 13 ],
  [ 20, 7, 10, 15, 25, 8, 13 ],
  [ 20, 23, 19, 10, 15, 25, 8 ],
  [ 20, 23, 19, 10, 15, 25, 13 ],
  [ 20, 23, 19, 10, 15, 8, 13 ],
  [ 20, 23, 19, 10, 25, 8, 13 ],
  [ 20, 23, 19, 15, 25, 8, 13 ],
  [ 20, 23, 10, 15, 25, 8, 13 ],
  [ 20, 19, 10, 15, 25, 8, 13 ],
  [ 7, 23, 19, 10, 15, 25, 8 ],
  [ 7, 23, 19, 10, 15, 25, 13 ],
  [ 7, 23, 19, 10, 15, 8, 13 ],
  [ 7, 23, 19, 10, 25, 8, 13 ],
  [ 7, 23, 19, 15, 25, 8, 13 ],
  [ 7, 23, 10, 15, 25, 8, 13 ],
  [ 7, 19, 10, 15, 25, 8, 13 ],
  [ 23, 19, 10, 15, 25, 8, 13 ] ];
  
  const result =  test_arr.filter(arr => arr.reduce((a, b) => a + b, 0) == 100);
  
  console.log(result);
...