Я создал функцию, которая фильтрует массив данных по одному или нескольким свойствам.
Это выглядит так:
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, который просто взглянул на ваш код и торжественно произнес «Неожиданно ложь». Мне пришлось добавить в код операторы console.info()
, проверить странные результаты и заметить, что console.info(propertyString)
выдавал ""
вместо ожидаемого 0
. Я настоятельно рекомендую вам попробовать войти и / или выполнить код с помощью отладчика, когда вы столкнетесь с подобными проблемами. Stack Overflow - это здорово, и вы обязательно должны задавать вопросы, если вам нужна помощь, но если вы хотите что-то диагностировать и исправить, сделать это самостоятельно, как правило, быстрее и надежнее, чем пытаться создать минимальный, полный и проверяемый пример, а затем ждать, пока кто-то другой, надеюсь, поймет а затем ответьте правильно.
Надеюсь, это помогло. Удачного кодирования!
Проходит :) Спасибо!