【问题标题】:using reduce to remove item from array使用 reduce 从数组中删除项目
【发布时间】:2018-03-13 13:20:04
【问题描述】:

我需要一些帮助才能从数组中删除项目。我有许多复选框,每个复选框都有一个动态创建的数据属性。在取消选中复选框时,我想从数组中删除与每个数组项的 item.sector 值匹配的项。我不能让它工作。任何帮助将不胜感激。

let mapMarkers = [];

function addFilter(self) {
        const markerObject = filterObject[self.id];
        const markerID = markerObject[0]["id"];
        const dataSetSector = self.dataset.sector;
        const dataSetYear = self.dataset.year;

        if (self.checked) {
            mapMarkers.push(markerObject);
        } else {
            // data attribute SECTOR exists
            if (self.hasAttribute("data-sector")) {
                mapMarkers = mapMarkers.reduce((acc, curr) => {             
                    if (curr.sector !== dataSetSector) acc.push(curr);
                    return acc;
                });
            } 
            // data attribute YEAR exists
            else if (self.hasAttribute("data-year")) {
                mapMarkers = mapMarkers.reduce((acc, curr) => {         
                    if (curr.sector !== dataSetYear) acc.push(curr);
                    return acc;
                });
            }
        }
    }  

【问题讨论】:

  • 你可以使用filter insetad of reduce

标签: javascript arrays higher-order-functions


【解决方案1】:

reduce的第二个参数是初始值,即acc的初始值。由于您在acc 上调用push 方法,它应该是一个数组。

当您省略第二个参数时,数组中的第一个元素将用作初始值。即:第一个电话需要(mapMarkers[0], mapMarkers[1])

要解决此问题,请将新数组传递给 reduce 方法:

mapMarkers = mapMarkers.reduce((acc, curr) => {             
  if (curr.sector !== dataSetSector) acc.push(curr);
  return acc;
}, []);
//  ^--- change

或者,按照 cmets 中的建议,您可以使用 filter

【讨论】:

  • 感谢您的回复。这很有效,很棒。但是,当我注销 mapMarkers 时,它会显示应该过滤掉的条目而不是我想要保留的条目。
  • 您通过否定运算符来反转“选择”:将 !== 更改为 ===
猜你喜欢
  • 2013-12-03
  • 2021-10-19
  • 2022-01-13
  • 2021-10-03
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 2013-06-08
  • 2020-07-01
相关资源
最近更新 更多