Итерация массива элементов в nodejs - PullRequest
0 голосов
/ 08 июля 2019

У меня есть index.js, из которого я вызываю util.js, как показано ниже:

util.js

module.exports.getResult = json => {
  return json.hits.hits.map(element => {
    const { _source } = element;

    return _source.details
      .filter(item => item.hasOwnProperty('deliveryDetails'))
      .map(item => {
        return item.deliveryDetails
          .filter(deliveryDetail => deliveryDetail.noOfItems > 0)
          .map(deliveryDetail => {
            return {
              id: item.Id,
              name: _source.name,
              noOfItems: deliveryDetail.noOfItems,
            };
          });
      });
  });
};

Так как я возвращаюсь несколько раз, результат из самого внутреннего .map изменяется в массив массива. Это то, что ожидается при итерации или я делаю это неправильно?

Затем, чтобы получить результат в одном конечном массиве, я должен сделать это ниже в index.js:

const temp = helper.getResult(json);
const result = [].concat.apply([], [].concat.apply([], temp));

Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Да - используйте flat.Чтобы получить глубину, вы просто работаете с length + 2.

const result = temp.flat(temp.length + 2);

. Используйте рекурсивную функцию для reduce.

const flattenDeep = arr => arr.reduce((a, c) => a.concat(Array.isArray(c) ? flattenDeep(c) : c), []);
const result = flattenDeep(temp);
.
0 голосов
/ 08 июля 2019
Array.prototype.flattenDeep = function() {
   return this.reduce((acc, val) => Array.isArray(val) ? acc.concat(val.flattenDeep()) : acc.concat(val), []);
}


const result =  temp.flattenDeep();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...