I create the columns and I have a checkbox which shows the columns name. When I click a checkbox square I get an array of checked names which are stored in checkedKeys
. Now checkableColumns
contains all the possible checkable values.
Those elements which are in checkableColumns but not in checkedKeys are those columns that will disappear from the table’s columns.
I don’t filter from all columns because some columns should always be visible.
This is common part to reduce and forEach:
const columns = initColumns(); const checkableColumns = ["n", "yi", "ui", "r", "t"]; const notCheckedValues = checkableColumns.filter(col=>!checkedKeys.includes(col)); const filteredColumns =[];
Here how I solved with forEach:
columns.forEach(column=>{ if(!notCheckedValues.includes(column.dataIndex)){ filteredColumns.push(column); } })
Here how I tried to solve with reduce, but it doesn’t work and I didn’t understand:
const filteredColumns = columns.reduce((allColumns, currentColumn)=>{ if(notCheckedValues.includes(currentColumn.dataIndex)){ return allColumns; } console.log("all cols",allColumns, "push",allColumns.push(currentColumn)) return allColumns.push(currentColumn) }, [])
Advertisement
Answer
Array.prototype.push
does not return the Array, but the new length of the array: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push
Instead, you would need to return the accumulator after pushing:
const filteredColumns = columns.reduce((allColumns, currentColumn) => { if (notCheckedValues.includes(currentColumn.dataIndex)) { return allColumns; } allColumns.push(currentColumn) return allColumns }, [])
You could however also do this in a more idiomatic way by using Array.prototype.filter
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
const filteredColumns = columns.filter((currentColumn) => { return !notCheckedValues.includes(currentColumn.dataIndex) })