Чтобы итерировать массив, всегда нужен минимум один цикл (если считать даже рекурсию таковой). Поэтому ответ - нет.
UPD: только это настолько бессмысленно, что даже вредит скорости. Я взял вариант
Сергей Соколов и
0xD34F и добавил очевидный вариант
[].concat.apply([], array).reduce(function (res, item) { return res + item; })
И замерил их скорость.
const array = [
[1,4],
[11],
[3,5,7]
];
function sum(arr) {
if (!arr.length) {
return 0;
}
let val = arr[0];
if (val instanceof Array) {
val = sum(val);
}
return val + sum(arr.slice(1));
}
console.time('eval');
for (let i = 0; i < 1000; i++) {
eval(JSON.stringify(array).replace(/[^\d]+/g, '+') + '0') // 31
}
console.timeEnd('eval');
console.time('sum recursion');
for (let i = 0; i < 1000; i++) {
sum(array);
}
console.timeEnd('sum recursion');
console.time('sum normal');
for (let i = 0; i < 1000; i++) {
[].concat.apply([], array).reduce(function (res, item) { return res + item; })
}
console.timeEnd('sum normal');
На таком массиве при 1000 выполнений у меня вот такие результаты
eval: 44.69287109375ms
sum recursion: 2.64501953125ms
sum normal: 0.951904296875ms
Вариант без извращений явно быстрее. Да и он написан в лоб, т.е. без раздумий, я думаю, можно написать лучше (на тех же циклах).
Да и нативные методы не такие медленные, как вам кажутся.