Как я могу отделить вложенные методы forEach? - PullRequest
1 голос
/ 20 марта 2020

В последнее время я действительно стараюсь изо всех сил пытаться найти способы избавиться от необходимости делать вложенные методы for-loop / forEach и действительно оптимизировать столько, сколько могу, но я немного застрял на этом. У меня есть список данных, который представляет собой массив объектов, который также содержит массив объектов. Я знаю, как сделать это с отдельными функциями, если все, что мне нужно, это атрибуты из второго вложенного массива, но моя проблема в том, что мне нужны атрибуты из обоих, и я не уверен, как я могу выполнить sh это без использования вложенных циклов .

Вот пример того, как выглядят данные:

let data = [{Id: '1234', Server: 'prime', Status: 'open', Connections: [{Type: 'xxr', ConID: '1222'}]},
 {Id: '1214', Server: 'prime', Status: 'open', Connections: [{Type: 'xxh', ConID: '1111'}, {Type: 'xxh', ConID: '1112'}]},
 {Id: '1233', Server: 'tif', Status: 'closed', Connections: [{Type: 'xml', ConID: '1212'}, {Type: 'xxr', ConID: '1233'}, {Type: 'xxh', ConID: '1111'}]}]

Прямо сейчас вот как я перемещаю нужные мне данные в новый массив:

let newArray = [];

  data.forEach(server => { 
            let temp = server.Connections;
            temp.forEach(obj => {

                let newObj = {
                    ServerID: server.ID,
                    Server: server.Server,
                    Status: server.Status,
                    ConnectionID: obj.ConID
                }
                newArray.push(newObj);
            })
        })

Я действительно хотел бы использовать карту в этой ситуации, если это возможно, вместо нажатия на newArray через forEach, но я действительно не уверен, как я могу выполнить sh это, когда мне нужны атрибуты из обоих массивы без вложенного l oop. Если у кого-нибудь есть предложения о том, как я могу это сделать, это было бы здорово. Может быть, это невозможно, и для этой ситуации это просто вложенный l oop, но я чувствую, что есть способ отделить его. Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 20 марта 2020

Вы можете использовать функцию массива flatMap.

let newArray = data.flatMap(server => server.Connections.map(conn => ({
    ServerID: server.Id,
    Server: server.Server,
    Status: server.Status,
    ConnectionID: conn.ConID
})));
1 голос
/ 20 марта 2020

Вы не можете избежать вложенного l oop, но вы можете использовать .map() .by, вкладывая .map() операции и затем вызывая .flat() для полученного массива массивов.

let newArray = data.map(server => {
    return server.Connections.map(obj => {
        return {
            ServerID: server.ID,
            Server: server.Server,
            Status: server.Status,
            ConnectionID: obj.ConID
        }
    });
}).flat();

Или вы можете использовать .flatMap() для верхнего уровня .map(), чтобы объединить .map() и .flat(). .flatMap() может быть немного более эффективным.

let newArray = data.flatMap(server => {
    return server.Connections.map(obj => {
        return {
            ServerID: server.ID,
            Server: server.Server,
            Status: server.Status,
            ConnectionID: obj.ConID
        }
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...