#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
объект, как показано в моем желаемом выводе. Ценю вашу помощь в этом!