Typescript 自定义筛选未按预期工作
我创建了一个函数,它通过一个或多个属性过滤数据数组 看起来是这样的:Typescript 自定义筛选未按预期工作,typescript,Typescript,我创建了一个函数,它通过一个或多个属性过滤数据数组 看起来是这样的: public filtered = createTransformer((filter: { [key: string]: string }): EntityType[] => { let array = this.entities Object.keys(filter).forEach(key => { array = array.filter(entity => {
public filtered = createTransformer((filter: { [key: string]: string }): EntityType[] => {
let array = this.entities
Object.keys(filter).forEach(key => {
array = array.filter(entity => {
const propertyString = (this.propertyAccessor(entity, key) || '').toString().trim().toLowerCase()
const filterString = filter[key].trim().toLowerCase()
return propertyString.includes(filterString)
})
})
return array
})
然后我有一个测试套件:
describe('filter tests', () => {
it('should filter one column', async () => {
await setEntities([
{id: 0, love: 5, isSuper: false},
{id: 1, love: 1, isSuper: true}
])
const store = new TestEntityStore()
await store.fetchAll()
expect(
store.getEntity(0)
).toBeDefined()
const filter = {
'id': '0'
}
expect(
store.filtered(filter).length
).toEqual(
store.entities.filter(x => x.id == 0).length
)
})
})
结果
Error: expect(received).toEqual(expected)
Expected value to equal:
1
Received:
0
我不知道可能出了什么问题。我100%确信propertyAccessor
和createTransformer
不是问题所在
提前感谢您的帮助。您的问题可能是
0 | |“
是”
,而不是0
。数字0
是,因此您在这里的支票上很粗心:
(this.propertyAccessor(entity, key) || '')
这适用于{id:1}
案例,但{id:0}
案例处理不正确。假设您只希望消除未定义的
或null
值,而不是所有虚假的值,那么您可能需要一个帮助函数,如:
function saferOr<T, U>(t: T | null | undefined, deflt: U): T | U {
return (typeof t === 'undefined' || t === null) ? deflt : t;
}
顺便说一句,我不是一个神奇的JavaScript巫师,他只是瞥了一眼你的代码,然后郑重地吟诵“出人意料的错误”。我不得不向代码中添加
console.log()
语句,检查奇怪的结果,并注意到console.log(propertyString)
正在吐出”
,而不是预期的0
。我强烈建议您在遇到此类问题时,尝试使用调试器记录和/或逐步完成代码。堆栈溢出非常好,如果需要帮助,您肯定应该问一些问题,但是如果您想诊断和修复某个问题,那么自己动手通常比尝试生成一个堆栈溢出然后等待其他人理解并正确回答要更快、更可靠
希望这有帮助。快乐编码 通行证:)谢谢!
const propertyString = saferOr(this.propertyAccessor(entity, key), '').
toString().trim().toLowerCase();