#json #typescript
Вопрос:
У меня есть массив объектов JSON, как показано ниже, и я хочу прочитать его, найти первый экземпляр имени приложения, например «app1», «app2», и сохранить весь объект для каждого…
myArray[
{
"myApp": {
"appname": "app1",
"servername": "randomname-xyx",
"status": "DOWN"
}
},
{
"myApp": {
"appname": "app1",
"servername": "another-random-name",
"status": "DOWN"
}
},
{
"myApp": {
"appname": "app2",
"servername": "some-server",
"status": "UP"
}
},
{
"myApp": {
"appname": "app2",
"servername": "abc-server",
"status": "DOWN"
}
},
{
"myApp": {
"appname": "app2",
"servername": "qwerty-srv",
"status": "DOWN"
}
},
{
"myApp": {
"appname": "app2",
"servername": "last-server",
"status": "UP"
}
},
]
На данный момент у меня есть это…
this.getAppClient.getFullList()
.subscribe((apps) => {
this.applicationList = [...new Map(apps.myArray.map((o: { myApp: { appname: any; }; })=>[o.myApp.appname, o])).values()]
})
…который фильтрует уникальные объекты по имени приложения, но возвращает последний объект для каждого имени приложения вместо первого, поэтому я получаю это…
{
"myApp": {
"appname": "app1",
"servername": "another-random-name",
"status": "DOWN"
}
},
{
"myApp": {
"appname": "app2",
"servername": "last-server",
"status": "UP"
}
},
…когда я захочу этого…
{
"myApp": {
"appname": "app1",
"servername": "randomname-xyx",
"status": "DOWN"
}
},
{
"myApp": {
"appname": "app2",
"servername": "some-server",
"status": "UP"
}
}
Можно ли изменить мой фильтр, чтобы таким образом отбирать объекты?
Ответ №1:
Это сделает свое дело
const tmpAppName = new Set<string>();
const result: any[] = [];
myArray.forEach(el => {
if(!tmpAppName.has(el.myApp.appname)) {
tmpAppName.add(el.myApp.appname);
result.push(el);
}
})
console.log(result);
Выход
[{
"myApp": {
"appname": "app1",
"servername": "randomname-xyx",
"status": "DOWN"
}
}, {
"myApp": {
"appname": "app2",
"servername": "some-server",
"status": "UP"
}
}]
Комментарии:
1. Если у вас много разных имен приложений, это будет происходить медленно, потому что он каждый раз сканирует tmpAppName. Вы можете заменить tmpAppName набором.
2. Обновлено набором.
3. Это прекрасно — он дал мне именно то, что мне было нужно. Большое спасибо. Пока я не слишком беспокоюсь о скорости ответа, но при необходимости подумаю об использовании набора позже.