'JS filter array all fields
How do I make this function search all fields in my array instead of a single variable at time?
const filteredData = tickets.filter(val => {
if (inputText === '') {
return val;
} else {
return val.ticket.ticketNumber.toLowerCase().includes(inputText);
// return val.ticket.gallons.toLowerCase().includes(inputText);
}
});
Ticket example (click to show)
[
{
index: "-N-ecIthFAo6EaEe7BVT",
ticket: {
appName: "biolime",
driver: "Walt",
endUser: "Verhoff Farms",
field: "Marston-North 40",
gallons: "1,237,887",
lagoon: "CAMP-3",
lagoonMaterial: "Lime Slurry",
source: "Campbell's Soup",
ticketDate: "04-04-2022",
ticketNumber: "5825",
ticketTime: "7:26:49.484 am",
truck: "",
zone: "Zone B",
},
},
{
index: "-N17TZscKkfW0TYE84WZ",
ticket: {
appName: "biolime",
driver: "Walt",
endUser: "Rob Howell",
field: "testing",
gallons: "9,999",
lagoon: "CAMP-3",
lagoonMaterial: "Lime Slurry",
source: "Campbell's Soup",
ticketDate: "04-13-2022",
ticketNumber: "5826",
ticketTime: "4:35:44.252 pm",
truck: "10",
zone: "",
},
},
];
Solution 1:[1]
You dont need to check inputText === '' everytime inside the filter callback.
const ticket = [{
"appName": "biolime",
"driver": "Walt",
"endUser": "Verhoff Farms",
"field": "Marston-North 40",
"gallons": "1,237,887",
"lagoon": "CAMP-3",
"lagoonMaterial": "Lime Slurry",
"source": "Campbell's Soup",
"ticketDate": "04-04-2022",
"ticketNumber": "5825",
"ticketTime": "7:26:49.484 am",
"truck": "",
"zone": "Zone B"
},
{
"appName": "biolime",
"driver": "Walt",
"endUser": "Rob Howell",
"field": "testing",
"gallons": "9,999",
"lagoon": "CAMP-3",
"lagoonMaterial": "Lime Slurry",
"source": "Campbell's Soup",
"ticketDate": "04-13-2022",
"ticketNumber": "5826",
"ticketTime": "4:35:44.252 pm",
"truck": "10",
"zone": ""
}
]
function filteredData(e) {
const filteredData = e.target.value && ticket.filter(val => {
return val.ticketNumber.toLowerCase().includes(e.target.value);
});
console.log(filteredData)
};
<input type="text" onChange="filteredData(event)">
Solution 2:[2]
Maybe you should loop through tickets and return one, that has given inputText in field?
const filteredData = tickets.filter(ticket => {
if (inputText === '') {
return ticket;
} else if (ticket.ticketNumber.toLowerCase().includes(inputText)) {
return ticket;
}
});
If I understand question correctly...
Solution 3:[3]
As suggested by @Barmar, loop over all the fields of an object with Object.values(obj) and test if any meet the condition with Array.prototype.some(). But like I said, you need to do it a bit differently since you have nested objects.
const tickets = [{
index: "-N-ecIthFAo6EaEe7BVT",
ticket: {
appName: "biolime",
driver: "Walt",
endUser: "Verhoff Farms",
field: "Marston-North 40",
gallons: "1,237,887",
lagoon: "CAMP-3",
lagoonMaterial: "Lime Slurry",
source: "Campbell's Soup",
ticketDate: "04-04-2022",
ticketNumber: "5825",
ticketTime: "7:26:49.484 am",
truck: "",
zone: "Zone B",
},
},
{
index: "-N17TZscKkfW0TYE84WZ",
ticket: {
appName: "biolime",
driver: "Walt",
endUser: "Rob Howell",
field: "testing",
gallons: "9,999",
lagoon: "CAMP-3",
lagoonMaterial: "Lime Slurry",
source: "Campbell's Soup",
ticketDate: "04-13-2022",
ticketNumber: "5826",
ticketTime: "4:35:44.252 pm",
truck: "10",
zone: "",
},
},
];
const filterHelper = (ticket, inputText) => {
if (inputText === '') {
return true;
} else {
return Object.values(ticket).some((property) => {
if (typeof property === 'string' || property instanceof String) {
return property.toString().toLowerCase().includes(inputText);
} else
return filterHelper(property, inputText);
});
}
};
const filter = (tickets, inputText) => tickets.filter((ticket) => filterHelper(ticket, inputText));
//const filteredData = filter(tickets, "5825");
//console.log(filteredData);
const inputTextInput = document.querySelector("#inputText");
document.querySelector("#form").addEventListener("submit", (e) => {
e.preventDefault();
const inputText = inputTextInput.value;
const filteredData = filter(tickets, inputText);
console.log(filteredData);
});
<form id="form">
<input id="inputText" placeholder="filter" />
<button type="submit">filter</button>
</form>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | brk |
| Solution 2 | Alex Tom |
| Solution 3 |
