自定义筛选无法按预期工作



>我创建了一个函数,该函数按一个或多个属性过滤数据数组。

它看起来像这样:

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%确定propertyAccessorcreateTransformer不是问题。

提前感谢您的帮助。

你的问题大概是0 || """",而不是00的数字是假的,所以你在这里检查不小心:

(this.propertyAccessor(entity, key) || '')

这适用于{id: 1}情况,但{id: 0}情况处理不正确。 假设您只想消除undefinednull值,而不是所有虚假值,您可能需要一个帮助程序函数,例如:

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 很棒,如果您需要帮助,您绝对应该提出问题,但是如果您想诊断和修复某些问题,自己动手通常比尝试生成最小、完整和可验证的示例更快、更可靠,然后等待其他人希望理解然后正确回答它。


希望有帮助。祝您编码愉快!

最新更新