В Typescipt, как я могу отфильтровать первый уникальный объект, встречающийся в массиве объектов?

#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. Это прекрасно — он дал мне именно то, что мне было нужно. Большое спасибо. Пока я не слишком беспокоюсь о скорости ответа, но при необходимости подумаю об использовании набора позже.