Функция для массива в JS

Функция должна найти минимальную сумму num элементов из значений массива array.

Пример значений переменных:

array = [2, 4, 7, 8, 1]
num = 2

Пример результата:

3

Условие:

В программе задан массив array, элементы которого имеют численное значение, и переменная num, которая является числом. Реализуйте функцию queue(num, ...array), которая принимает в качестве аргументов множество значений списка array и значение переменной num. Функция должна найти минимальную сумму num элементов из значений массива array. Ответ выведите в консоль.

Код:

const queue = (numsCount, ...arr) => {
  const array = arr[0];
  let nums = new Array(numsCount).fill(Infinity);
  array.forEach(num => {
    for (let i = 0; i < nums.length; ++i) {
      if (nums[i] <= num) continue;
      nums.splice(i, 0, num);
      nums.pop();
      break;
    }
  });
  nums = nums.map(x => x === Infinity ? 0 : x);
  const sum = nums.reduce((a, b) => a + b, 0);
  console.log(sum);
}

также пробовал и:

function queue (numsCount, ...arr) {
  const array = arr[0];
  let nums = new Array(numsCount).fill(Infinity);

  array.forEach(num => {
    for (let i = 0; i < nums.length; ++i) {
      if (nums[i] <= num) continue;

      nums.splice(i, 0, num);
      nums.pop();
      break;
    }
  });

  nums = nums.map(x => x === Infinity ? 0 : x);

  const sum = nums.reduce((a, b) => a + b, 0);
  
  console.log(sum);
}

queue(num, array) отрабатывает, а queue(num, ...array) выдает:

Uncaught TypeError: array.forEach is not a function
    at queue (<anonymous>:5:9)
    at <anonymous>:1:1

Ответы (2 шт):

Автор решения: EzioMercer

Предлагаю такой алгоритм:

const findMinSum = (numsCount, ...arr) => {
  const array = arr[0];
  let nums = new Array(numsCount).fill(Infinity);

  array.forEach(num => {
    for (let i = 0; i < nums.length; ++i) {
      if (nums[i] <= num) continue;

      nums.splice(i, 0, num);
      nums.pop();
      break;
    }
  });

  nums = nums.map(x => x === Infinity ? 0 : x);

  const sum = nums.reduce((a, b) => a + b, 0);
  
  return sum;
}

const array = [2, 4, 7, 8, 1];
const num = 2;

console.log(findMinSum(num, array));

И так мы заранее создаём массив нужной нам длины, заполненный значением Infinity. Выбрано это значение, т.к. любое число будет меньше чем бесконечность. Далее просто проходимся по входному массиву и смотрим между какими двумя элементами можно вставить данное число и удаляем последний элемент, т.к. после вставки размер массива увеличится на 1. Т.к. мы каждый раз вставляем в нужное место число, то отдельно сортировать массив не приходится и благдаря этому мы можем каждый раз, начинать проход с самого начала. Ну и в конце избавляемся от лишних Infinity, если они остались, конечно. Остаётся только сложить все получившиеся элементы

→ Ссылка
Автор решения: Nikolai

function queue(num, ...array) {
  let sortArr = array.sort((a, b) => a - b);
  let result = sortArr.reduce((acc, n) => {
    if (acc.counter < num) {
      acc.counter++;
      acc.sum += n;
    }
    return acc;
  }, {
    counter: 0,
    sum: 0
  });
  console.log(result.sum)
};

let array = [2, 4, 7, 8, 1];
let num = 2;

queue(num, ...array);

→ Ссылка