Объединить два объекта массива с одинаковой структурой - PullRequest
0 голосов
/ 04 мая 2020

Я внедряю службу, которая извлекает список терминов из черного списка из файла json.

@Injectable()
export class BlacklistService {
  private readonly BLACKLIST_FOLDER = './assets/data/web-blacklist';
  private readonly blacklistEnglishTerms: any;
  private readonly blacklistFrenchTerms: any;

  constructor(
    public httpClient: HttpClient
  ) {
    this.blacklistEnglishTerms = this.httpClient.get(`${this.BLACKLIST_FOLDER}/en.json`);
    this.blacklistFrenchTerms = this.httpClient.get(`${this.BLACKLIST_FOLDER}/fr.json`);
  }

  public getAllBlackListTerms(): Observable<any> {
    return combineLatest([
      this.blacklistEnglishTerms,
      this.blacklistFrenchTerms
    ]);
  }
}

Для справки каждый файл json выглядит следующим образом:

{
  "blacklist": [
    "...",
    "...",
    "..."
  ]
}

Я получаю все элементы в моем компоненте следующим образом:

this.blacklistService.getAllBlackListTerms().pipe(takeUntil(this.ngUnsubscribe)).subscribe(blacklistTerms => {
  console.log(blacklistTerms);
});

blacklistTerms возвращает в виде массива из 2 объектов массива. Как мне объединить эти два объекта в один объект (оба имеют одинаковую структуру).

enter image description here

Ответы [ 5 ]

2 голосов
/ 04 мая 2020

я думаю, что вы используете concat ().
concat () используется для комбинированных буксирных массивов.

public getAllBlackListTerms(): Observable<any> {
    
   return combineLatest = this.blacklistEnglishTerms.concat(this.blacklistFrenchTerms);
  }
2 голосов
/ 04 мая 2020

Черный список - это массив - даже простой конкат может помочь !!

var blacklistEnglishTerms = {
  "blacklist": [
    "a",
    "b",
    "c"
  ]
}
var blacklistFrenchTerms = {
  "blacklist": [
    "e",
    "f",
    "g"
  ]
}
console.log(blacklistEnglishTerms.blacklist.concat(blacklistFrenchTerms.blacklist));
2 голосов
/ 04 мая 2020

Пожалуйста, попробуйте следующий подход

var s  = [{a:[1,2,3]},{a:[6,7,8]}]
var obj = {}
for(let i in s){
    if(!obj['a']){obj['a'] = s[i]['a'];}
    else{
   obj['a'].push(...s[i]['a'])
    }
}

console.log(obj)

но здесь вам нужно вручную определить blacklist

2 голосов
/ 04 мая 2020

Учитывая, что у вас есть известные результаты, т.е. вы знаете, что у результатов Observbales будет только один ключ: черный список, который вы можете изменить, например:

public getAllBlackListTerms(): Observable<any> {
    return zip(
        this.blacklistEnglishTerms,
        this.blacklistFrenchTerms
    ).pipe(map([first, second]) => {
        return { blackList: [...first.blackList, ...second.blackList]};
    });
}

Я также заменил combineLatest() с zip(), потому что вы, вероятно, хотите получить результаты только тогда, когда оба имеют выданные значения.

1 голос
/ 04 мая 2020

Попробуйте использовать flatMap () как blacklistTerms.flatMap(x => x.blacklist)

this.blacklistService.getAllBlackListTerms().pipe(takeUntil(this.ngUnsubscribe)).subscribe(blacklistTerms => {
  console.log(blacklistTerms.flatMap(x => x.blacklist));
});

Тест ниже.

let blacklistTerms = [
  { blacklist: [0, 1, 2] },
  { blacklist: [2, 3] }
];

console.log(blacklistTerms.flatMap(x => x.blacklist));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...