合并两个结构完全相同的数组对象

时间:2020-05-04 10:19:47

标签: javascript angular

我正在实现一项从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 个答案:

答案 0 :(得分:2)

鉴于,您已经知道了结果,即您知道Observbales的地狱的结果只有一个键:blackList,您可以像这样修改服务:

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

我也将combineLatest()替换为zip(),因为您可能只在两个都有发射值时才想要结果。

答案 1 :(得分:2)

请尝试以下方法

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 :(得分:2)

黑名单是一个数组-即使是简单的concat也可以提供帮助!

var blacklistEnglishTerms = {
  "blacklist": [
    "a",
    "b",
    "c"
  ]
}
var blacklistFrenchTerms = {
  "blacklist": [
    "e",
    "f",
    "g"
  ]
}
console.log(blacklistEnglishTerms.blacklist.concat(blacklistFrenchTerms.blacklist));

答案 3 :(得分:2)

我认为您请使用concat()。
concat()用于合并两个数组。

public getAllBlackListTerms(): Observable<any> {
    
   return combineLatest = this.blacklistEnglishTerms.concat(this.blacklistFrenchTerms);
  }

答案 4 :(得分:1)

尝试像blacklistTerms.flatMap(x => x.blacklist)一样使用flatMap()

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));