我创建了一个按一个或多个属性过滤数据数组的函数。
看起来像这样:
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
我不知道可能出了什么问题。我完全相信propertyAccessor
和createTransformer
不是问题。
提前感谢您的帮助。
答案 0 :(得分:1)
您的问题可能是0 || ""
是""
,而不是0
。 0
号码是falsy,因此您在这里检查时不小心:
(this.propertyAccessor(entity, key) || '')
这适用于{id: 1}
案例,但{id: 0}
案例处理不当。假设您只想消除undefined
或null
值而不是所有虚假值,您可能需要一个辅助函数,如:
function saferOr<T, U>(t: T | null | undefined, deflt: U): T | U {
return (typeof t === 'undefined' || t === null) ? deflt : t;
}
然后使用它代替||
:
const propertyString = saferOr(this.propertyAccessor(entity, key), '').
toString().trim().toLowerCase();
顺便说一句,我不是一个神奇的JavaScript向导,他只是瞥了一眼你的代码并庄严地吟唱着“ Unexpectedly Falsy ”。我必须在代码中添加console.log()
语句,检查奇怪的结果,并注意console.log(propertyString)
正在吐出""
而不是预期的0
。我强烈建议您在遇到类似问题时尝试使用调试器记录和/或单步执行代码。 Stack Overflow很棒,如果你需要帮助,你肯定会问问题,但是如果你想要诊断并修复某些东西,那么自己做这件事通常比试图生成minimum, complete, and verifiable example然后等待某人更快更可靠否则希望能够理解并正确回答。
希望有所帮助。快乐的编码!