Как сделать такую функцию?
Как-то так (в виде однострочника):const f = (a, sum) => a.reduce((r, x, i) => r.concat(a.slice(i+1).filter(y => x + y == sum).map(y => [x, y])), [])Но для больших объёмов данных это вряд ли будет эффективно, скорее всего, самое обычное решение с двумя вложенными циклами будет работать шустрее и менее затратно по памяти, чем в цикле гонять массив через slice/filter/map. В лоб это как-то так:const f = (a, sum) => {
  const l = a.length;
  let r = [];
  for (let i = 0; i < l-1; i++)
    for (let j = i+1; j < l; j++)
      if (a[i] + a[j] == sum)
        r.push([a[i], a[j]]);
  return r;
}
Как-то так (в виде однострочника):const f = (a, sum) => a.reduce((r, x, i) => r.concat(a.slice(i+1).filter(y => x + y == sum).map(y => [x, y])), [])Но для больших объёмов данных это вряд ли будет эффективно, скорее всего, самое обычное решение с двумя вложенными циклами будет работать шустрее и менее затратно по памяти, чем в цикле гонять массив через slice/filter/map. В лоб это как-то так:const f = (a, sum) => {
  const l = a.length;
  let r = [];
  for (let i = 0; i < l-1; i++)
    for (let j = i+1; j < l; j++)
      if (a[i] + a[j] == sum)
        r.push([a[i], a[j]]);
  return r;
}