Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 自定义筛选未按预期工作_Typescript - Fatal编程技术网

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();