【发布时间】:2019-10-22 15:47:06
【问题描述】:
我正在从 swagger 宠物 API 中获取宠物列表。我想删除具有重复 ID 的宠物,然后将其发送到 React 以避免重复密钥问题。我尝试了下面的代码,但对我不起作用。谁能帮我解决这个问题?
我是 RxJS 的新手,所以想删除根据宠物 ID 过滤不同对象的注释代码。
export function fetchPetEpic(action$) {
return action$.pipe(
ofType('GET_PETS'),
switchMap(action =>
ajax.getJSON(`https://petstore.swagger.io/v2/pet/findByStatus?status=${action.payload}`).pipe(
map( response => response.map( (pet) => ({
id: pet.id,
pet: pet.pet
}))),
distinct( petList => petList.id),
// map( petList => petList.filter((pet, index, list) => {
// return list.map(petObj =>
// petObj.id).indexOf(pet.id) === index;
// })),
map(response => petActions.setPets(response))
)),
catchError( error => ({ type: 'ERROR_PETS_FETCH', payload: error})),
)
}
假设 pets 数组类似于 [ { id:1,宠物:狗},{ id:2,宠物:猫},{ id:3,宠物:鱼},{ id:2,宠物:老鼠},{ id:4,宠物:鹦鹉}, { id:1,宠物:猫头鹰 } ]
预期输出:[{ id: 1, pet: dog}, { id: 2, pet: cat }, { id: 3, pet: fish}, { id: 4, pet: parrot}]
我得到的输出是与输入相同的数组。
【问题讨论】:
-
distidnct的文档说,“返回一个 Observable,它发出源 Observable 发出的所有项目,这些项目与以前的项目相比是不同的。”除非您一个接一个地重复,否则distinct不会删除它。事实上——我认为没有你会更好。您希望将集合作为事件进行操作,而不是将集合中的单个项目作为事件进行操作。 -
但是,如果您查看官方文档中的链接,同样的问题已解决 - rxjs-dev.firebaseapp.com/api/operators/distinct。无法弄清楚为什么它对我不起作用!
-
@seniorquico 你能看看我上面提到的链接吗?