微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我想用相同但使用reduce完成的forEach函数替换这个函数你能说我哪里做错了吗?

如何解决我想用相同但使用reduce完成的forEach函数替换这个函数你能说我哪里做错了吗?

我创建了列,并且有一个显示名称的复选框。当我点击一个复选框时,我会得到一个存储在 checkedKeys 中的选中名称数组。现在 checkableColumns 包含所有可能的可检查值。 那些在 checkableColumns 但不在 checkedKeys 中的元素是那些将从表的列中消失的列。 我不会从所有列中过滤,因为某些列应该始终可见。 这是 reduce 和 forEach 的常见部分:

const columns = initColumns();
        const checkableColumns = ["n","yi","ui","r","t"];
        const notCheckedValues = checkableColumns.filter(col=>!checkedKeys.includes(col));
        const filteredColumns =[];

这里是我如何用 forEach 解决的:

columns.forEach(column=>{
      if(!notCheckedValues.includes(column.dataIndex)){
            filteredColumns.push(column);
          }
    })

这里我试图用reduce来解决,但它不起作用,我不明白:

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)
    },[])

解决方法

Array.prototype.push 不返回数组,而是返回数组的新长度:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/push

相反,您需要在推入后返回累加器:

const filteredColumns = columns.reduce((allColumns,currentColumn) => {
  if (notCheckedValues.includes(currentColumn.dataIndex)) {
    return allColumns;
  }
  allColumns.push(currentColumn)
  return allColumns
},[])

不过,您也可以使用 Array.prototype.filterhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

以更惯用的方式执行此操作
const filteredColumns = columns.filter((currentColumn) => {
  return !notCheckedValues.includes(currentColumn.dataIndex)
})

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。