Array 'map' vs 'forEach' - функциональное программирование - PullRequest
0 голосов
/ 14 мая 2018

У меня есть массив объектов:

let reports = [{ inbound_calls: [...], outbound_calls: [...],  outbound_national_calls: [...] },...];

Каков наилучший способ создания нового массива и присвоения переменной:

1-й подход - один цикл:

let inbound_calls = []; outbound_national_calls = [], outbound_calls = [];

reports.forEach((e) => {
 inbound_calls.push(e.inbound_calls);
 outbound_national_calls.push(e.outbound_national_calls);
 outbound_calls.push(e.outbound_calls);
})

2-й подход:

let inbound_calls = this.reports.map((report) => report.inbound_calls)
let outbound_national_calls = this.reports.map((report) => report.outbound_national_calls)
let outbound_calls = this.reports.map((report) => report.outbound_calls)

Я начинаю изучать функциональное программирование и хочу применить его к своему коду.перейти к первому подходу (один цикл), но, поскольку я проводил исследование о функциональном программировании, я думаю, что второй - правильный путь (намного чище), но, я не уверен, что является более дешевой операцией?

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Если вы хотите скопировать массивы, просто используйте Array#slice (переданный 0 необязателен, так как это начальный индекс по умолчанию, поэтому вы можете опустить его, если хотите), например:

let inbound_calls = reports.inbound_calls.slice(0),
    outbound_national_calls = reports.outbound_national_calls.slice(0), 
    outbound_calls = reports.outbound_calls.slice(0);

или Array.from как:

let inbound_calls = Array.from(reports.inbound_calls),
    outbound_national_calls = Array.from(reports.outbound_national_calls), 
    outbound_calls = Array.from(reports.outbound_calls);
0 голосов
/ 14 мая 2018

То, что вы, по сути, делаете, это транспонирование матрицы:

const report = (inbound_calls, outbound_calls, outbound_national_calls) =>
    ({ inbound_calls, outbound_calls, outbound_national_calls });

const reports = [report(1,2,3), report(4,5,6), report(7,8,9)];

const transpose = reports =>
    report( reports.map(report => report.inbound_calls)
          , reports.map(report => report.outbound_calls)
          , reports.map(report => report.outbound_national_calls) );

console.log(transpose(reports));

Теперь, в зависимости от вашего приложения, самый быстрый способ транспонировать матрицу - это вообще не транспонировать ее. Например, предположим, что у вас есть матрица A и ее транспонирование B. Тогда это справедливо для всех индексов i и j, A[i][j] = B[j][i]. Рассмотрим:

const report = (inbound_calls, outbound_calls, outbound_national_calls) =>
    ({ inbound_calls, outbound_calls, outbound_national_calls });

const reports = [report(1,2,3), report(4,5,6), report(7,8,9)];

// This is equivalent to transpose(reports).outbound_calls[1]
const result = reports[1].outbound_calls;

console.log(result);

Как говорится, ваш второй подход ИМХО наиболее читабелен.

0 голосов
/ 14 мая 2018

Если вашей конечной целью является создание трех переменных из объекта, вы можете использовать деструктуризацию объекта следующим образом.Никаких петель не требуется.

let reports = {
  inbound_calls: [1, 2, 3],
  outbound_calls: [4, 5, 6],
  outbound_national_calls: [7, 8, 9]
};

let {inbound_calls, outbound_calls, outbound_national_calls} = reports;
console.log(inbound_calls);
console.log(outbound_calls);
console.log(outbound_national_calls);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...