我正在实现一项从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个数组对象的数组返回。如何将这两个对象合并为一个对象(两者具有相同的结构)。
答案 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));