I am trying to filter data based on input and it works fine but I want add an extra condition to it. It should return if titel or another value (for example sendFrom) is given.
const newData = masterDataSource.filter(function (item) {
const itemData = item.titel ? item.titel.toUpperCase() : ''.toUpperCase();
const textData = text.toUpperCase();
return itemData.indexOf(textData) > -1;
});
I tried adding some operators but it didn´t worked out as planed
const newData = masterDataSource.filter(function (item) {
const itemData = item.titel || item.sendFrom ? item.titel.toUpperCase() || item.sendFrom.toUpperCase() : ''.toUpperCase();
const textData = text.toUpperCase();
return itemData.indexOf(textData) > -1;
});
thanks
If I understand what you're after you would want something like:
const itemData = item.titel ? item.titel.toUpperCase() : (item.sendFrom ? item.sendFrom.toUpperCase() : ''.toUpperCase());
Parentheses are not required, but I added them to make it easier to get the logic.
Also, ''.toUpperCase() doesn't make much sense, it's the same as ''.
You could replace the initial condition with
const itemData = (item.titel && item.titel.toUpperCase()) || '';
and the revised version:
const itemData = (item.titel && item.titel.toUpperCase()) || (item.sendFrom && item.sendFrom.toUpperCase()) || '';
Again, parentheses are not required.
References:
Conditional (ternary) operator
Logical Operators
You could collect the wanted properties in an array and iterate them while checking the values.
const newData = masterDataSource.filter(({ titel = '', sendFrom = '' }) =>
[titel, sendFrom].some(s => s.toUpperCase().includes(text.toUpperCase()))
);