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

时间:2018-05-01 09:36:05

标签: typescript

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

看起来像这样:

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

我不知道可能出了什么问题。我完全相信propertyAccessorcreateTransformer不是问题。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的问题可能是0 || """",而不是00号码是falsy,因此您在这里检查时不小心:

(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向导,他只是瞥了一眼你的代码并庄严地吟唱着“ Unexpectedly Falsy ”。我必须在代码中添加console.log()语句,检查奇怪的结果,并注意console.log(propertyString)正在吐出""而不是预期的0。我强烈建议您在遇到类似问题时尝试使用调试器记录和/或单步执行代码。 Stack Overflow很棒,如果你需要帮助,你肯定会问问题,但是如果你想要诊断并修复某些东西,那么自己做这件事通常比试图生成minimum, complete, and verifiable example然后等待某人更快更可靠否则希望能够理解并正确回答。

希望有所帮助。快乐的编码!