Как встроить ответ от метода в объект в NodeJS?

#javascript #node.js #arrays #dictionary #collections

#javascript #node.js #массивы #словарь #Коллекции

Вопрос:

У меня есть объект, который выглядит как показано ниже. Объект всегда будет иметь 3 error types error1 , error2 , error3

 const data =
{
  "error1": {
    "7": [
      {
        "ErrorType": "Error-1A",
        "Hostnames": "host123.com,hostabc.com,host33a.com..."
      }
    ],
    "8": [
      {
        "ErrorType": "Error-1B",
        "Hostnames": "host223.com,host2c.com,host43a.com..."
      },
      {
        "ErrorType": "Error-1C",
        "Hostnames": "host1231.com,host2abc.com,host313a.com..."
      }
    ]
  },
  "error2": {
    "3": [
      {
        "ErrorType": "Error-2A"
        "Hostnames": "host1231.com,host2abc.com,host313a.com..."
      },
      {
        "ErrorType": "Error-2B"
        "Hostnames": "host1231.com,host2abc.com,host313a.com..."
      }
    ],
    "8": [
      {
        "ErrorType": "Error-2C"
        "Hostnames": "host1231.com,host2abc.com,host313a.com..."
      },
      {
        "ErrorType": "Error-2D",
        "Hostnames": "host1231.com,host2abc.com,host313a.com..."
      }
    ]
  },
  "error3": {
    "1": [
      {
        "ErrorType": "Error-3A",
        "Hostnames": "host1236.com"
      },
      {
        "ErrorType": "Error-3B",
        "Hostnames": "hostc3231.com"
      }
    ]
  }
}
  

У меня есть функция fetchHostDetails(hostnames) , которая принимает hostnames в качестве входных данных и возвращает ответ, как показано ниже:

 [
  {
    "resType": "unknow data",
    "res": "missing data"
  },
  {
    "resType": "login failed",
    "res": "login with wrong userid"
  }
  ....
]
  

Приведенный выше ответ всегда будет иметь значения для resType и res , но таких записей может быть любое количество.

Для каждого набора Hostnames внутри data объекта, который я хочу вызвать fetchHostDetails(hostnames) , и хочу Hostnames заменить значением ответа в исходном data объекте

Желаемый ответ:

 {
  "error1": {
    "7": [
      {
        "ErrorType": "Error-1A",
        "result": [
          {
            "resType": "unknow data",
            "res": "missing data"
          },
          {
            "resType": "login failed",
            "res": "login with wrong userid"
          }
        ]
      }
    ],
    "8": [
      {
        "ErrorType": "Error-1B",
        "result": [
          {
            "resType": "new data",
            "res": "data"
          },
          {
            "resType": "data failed",
            "res": "invalid"
          },          {
            "resType": "res failed",
            "res": "discard"
          }
        ]
      },
      {
        "ErrorType": "Error-1C",
        "result": [
          {
            "resType": "sample data",
            "res": "sample"
          }
        ]
      }
    ]
  },
  "error2": {
    "3": [
      {
        "ErrorType": "Error-2A",
        "result": [
          {
            "resType": "Mydata",
            "res": "Mydata is empty"
          }
        ]
      },
    ...
  },
  "error3": {
    "1": [
     ...
    ]
  }
}
  

До сих пор я написал следующий код

 const hostNames = [];
        for (let key in data) {
            for (let number in data[key]) {
                data[key][number].map( d=> {
                    hostNames.push(d.Hostnames);
                });
            }
        }

`hostNames` array looks as below:
[
  "host123.com,hostabc.com,host33a.com...",
  "host223.com,host2c.com,host43a.com...",
  "host1231.com,host2abc.com,host313a.com...",
  "host1231.com,host2abc.com,host313a.com...",
...
]
  

Теперь мне нужно вызвать await fetchHostDetails(hostnames) для каждого значения внутри hostNames .
Мне также нужно встроить ответ в data объект.

Ответ №1:

Сначала вам нужно, чтобы каждое имя хоста было выделено из каждой строки в этом массиве. Как только вы это сделаете, вы сможете поместить их все в один array ( flat() ), а затем перебирать их для вызова fetchHostDetails(hostname) .

Пожалуйста, прочитайте комментарии в коде. Этот код будет выводить каждый URL-адрес в консоль, как если бы он был передан вашей функции выборки.

 const data = {
  "error1": {
    "7": [{
      "ErrorType": "Error-1A",
      "Hostnames": "host123.com,hostabc.com,host33a.com..."
    }],
    "8": [{
        "ErrorType": "Error-1B",
        "Hostnames": "host223.com,host2c.com,host43a.com..."
      },
      {
        "ErrorType": "Error-1C",
        "Hostnames": "host1231.com,host2abc.com,host313a.com..."
      }
    ]
  },
  "error2": {
    "3": [{
        "ErrorType": "Error-2A",
        "Hostnames": "host1231.com,host2abc.com,host313a.com..."
      },
      {
        "ErrorType": "Error-2B",
        "Hostnames": "host1231.com,host2abc.com,host313a.com..."
      }
    ],
    "8": [{
        "ErrorType": "Error-2C",
        "Hostnames": "host1231.com,host2abc.com,host313a.com..."
      },
      {
        "ErrorType": "Error-2D",
        "Hostnames": "host1231.com,host2abc.com,host313a.com..."
      }
    ]
  },
  "error3": {
    "1": [{
        "ErrorType": "Error-3A",
        "Hostnames": "host1236.com"
      },
      {
        "ErrorType": "Error-3B",
        "Hostnames": "hostc3231.com"
      }
    ]
  }
};

const out = [];
for (let key in data) {
  for (let number in data[key]) {
    data[key][number].map(d => out.push(d.Hostnames));
  }
}

out.flat().map(async urlList => {
  const responseArr = await fetchStuff(urlList);
  console.log(responseArr);
});

async function fetchStuff(urlList) {
  return urlList;
}  

Комментарии:

1. Я делаю responseArr.push(response); , но responseArr имею пустое значение.

2. Я не требую разделения каждого имени хоста, поскольку я забочусь об этом в своей fetchStuff функции. Не могли бы вы подсказать, почему responseArr он выглядит пустым?

3. Я отредактировал код / ответ. Посмотрите, отвечает ли это на ваш вопрос.

4. Хорошо, позвольте мне проверить это. Еще одна вещь, после console.log(responseArr); того, как мне в основном нужно встроить responseArr в data объект, как показано в моем желаемом выводе. Ценю вашу помощь в этом!