Reputation: 578
Details: I have an array of objects tied to the UI. When clicking on an item it triggers the toggleFilter method. If the item wasn't selected, it gets pushed into the filters array (which works fine). However, when I deselect an item it removes all of the entries that partially match the filter conditions.
Any help would be greatly appreciated.
Data:
filters:[
{"column":"name","value":"Test 1"},
{"column":"name","value":"Test 2"},
{"column":"name","value":"Test 3"},
{"column":"shortName","value":"XXX"}
]
Method:
toggleFilter(item) {
item.active = !item.active
if(item.active) {
this.filters.push({ column: item.column, value: item.value })
}
else {
this.filters = this.filters.filter(f => (f.column !== item.column && f.value !== item.value))
}
}
For example, if I select 4 filters, and then go to deselect the one where the object value is Test 3, all of the ones where the column is name also get removed.
Output:
filters:[
{"column":"shortName","value":"XXX"}
]
Expected:
filters:[
{"column":"name","value":"Test 1"},
{"column":"name","value":"Test 2"},
{"column":"shortName","value":"XXX"}
]
I need to filter on two conditions, as sometimes the column may differ, but the value may be the same, and I only want to remove the one that is deselected and replace the filters array. ie:
filters:[
{"column":"name","value":"test1"},
{"column":"shortName","value":"test1"}
]
Upvotes: 0
Views: 76
Reputation: 12113
TL; DR: Change &&
to ||
in your filter expression.
Whenever I run into problems like this, I like to slow down and run the matches individually to make sure I understand how my logic is applying:
item |
f |
f.column !== item.column |
f.value !== item.value |
&& |
|| |
---|---|---|---|---|---|
{"column":"name", "value":"Test 3"} |
{"column":"name", "value":"Test 1"} |
false | true | false | true |
{"column":"name", "value":"Test 3"} |
{"column":"name", "value":"Test 2"} |
false | true | false | true |
{"column":"name", "value":"Test 3"} |
{"column":"name", "value":"Test 3"} |
false | false | false | false |
{"column":"name", "value":"Test 3"} |
{"column":"shortName", "value":"XXX"} |
true | true | true | true |
Hopefully you see the pattern, and why AND wasn't working, but OR does.
Upvotes: 1