>我创建了一个函数,该函数按一个或多个属性过滤数据数组。
它看起来像这样:
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}
情况处理不正确。 假设您只想消除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向导,只是瞥了一眼你的代码,并郑重地语调">出乎意料地Falsy"。 我不得不在代码中添加console.log()
语句,检查奇怪的结果,并注意到console.log(propertyString)
吐出""
而不是预期的0
。 我强烈建议您在遇到此类问题时尝试使用调试器记录和/或单步执行代码。 Stack Overflow 很棒,如果您需要帮助,您绝对应该提出问题,但是如果您想诊断和修复某些问题,自己动手通常比尝试生成最小、完整和可验证的示例更快、更可靠,然后等待其他人希望理解然后正确回答它。
希望有帮助。祝您编码愉快!