Estoy tratando de filtrar datos según la entrada y funciona bien, pero quiero agregarle una condición adicional. Debería regresar si se proporciona el título u otro valor (por ejemplo, sendFrom).
const newData = masterDataSource.filter(function (item) { const itemData = item.titel ? item.titel.toUpperCase() : ''.toUpperCase(); const textData = text.toUpperCase(); return itemData.indexOf(textData) > -1; });Intenté agregar algunos operadores pero no funcionó como estaba planeado
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; });Gracias
Si entiendo lo que buscas, querrías algo como:
const itemData = item.titel ? item.titel.toUpperCase() : (item.sendFrom ? item.sendFrom.toUpperCase() : ''.toUpperCase());No se requieren paréntesis, pero los agregué para que sea más fácil obtener la lógica.
Además, ''.toUpperCase() no tiene mucho sentido, es lo mismo que '' .
Podrías reemplazar la condición inicial con
const itemData = (item.titel && item.titel.toUpperCase()) || '';y la versión revisada:
const itemData = (item.titel && item.titel.toUpperCase()) || (item.sendFrom && item.sendFrom.toUpperCase()) || '';De nuevo, no se requieren paréntesis.
Referencias:
Operador condicional (ternario)
Operadores logicos
Puede recopilar las propiedades deseadas en una matriz e iterarlas mientras verifica los valores.
const newData = masterDataSource.filter(({ titel = '', sendFrom = '' }) => [titel, sendFrom].some(s => s.toUpperCase().includes(text.toUpperCase())) );