首页 > 解决方案 > Array.filter() 返回不同的结果

问题描述

所以,我的代码中有这个功能:

filterByWeek(data) {
    //  so just like with the days, here we want to get a limited amount of data (last 6 weeks or less);
    const weeksAgo6 = moment().startOf('week').subtract(6, 'weeks').toDate();
    console.log('data', data);
    const filteredData = data.filter((item) => moment(item.date).isAfter(weeksAgo6));
    console.log('filter test1', data.filter((item) => moment(item.date).isAfter(weeksAgo6)));
    console.log('filter test2', filteredData);

    return filteredData;
  }

data 参数是一个数组,其对象如下所示:

{
  date: "2019-07-21T14:03:37.759Z",
  _id: "5d3b29e7e7e5db358c4ec482",
  exercise: "5d35da3142c6445078cd03f2",
  oneRM: 93
}

在这个数组中的所有对象中,我想过滤掉日期早于 6 周前的对象。我使用 Array.filter() 函数执行此操作。并且基于 console.logfilter test 1它应该可以工作。但后来我尝试 console.logfilter test 2并返回一个空数组。有人知道可能是什么原因造成的吗?

结果 console.log filter test 1:我预期的结果

[{
  "date": "2019-07-20T14:03:37.759Z",
  "_id": "5d3b0876e7e5db358c4ec47b",
  "exercise": "5d35da3142c6445078cd03f2",
  "oneRM": 86
},
{
  "date": "2019-07-21T14:03:37.759Z",
  "_id": "5d3b29e7e7e5db358c4ec482",
  "exercise": "5d35da3142c6445078cd03f2",
  "oneRM": 93
},
{
  "date": "2019-07-24T14:03:37.759Z",
  "_id": "5d3b3896e7e5db358c4ec48b",
  "exercise": "5d35da3142c6445078cd03f2",
  "oneRM": 89
}]

结果 console.log filter test 2:一个空数组,即使我认为我记录了同样的事情

在此处输入图像描述

标签: javascript

解决方案


无法重现您的问题,两个 (test1 & test2)console.log语句都记录相同的输出:

const data = [{
  "date": "2019-07-20T14:03:37.759Z",
  "_id": "5d3b0876e7e5db358c4ec47b",
  "exercise": "5d35da3142c6445078cd03f2",
  "oneRM": 86
},
{
  "date": "2019-07-21T14:03:37.759Z",
  "_id": "5d3b29e7e7e5db358c4ec482",
  "exercise": "5d35da3142c6445078cd03f2",
  "oneRM": 93
},
{
  "date": "2019-07-24T14:03:37.759Z",
  "_id": "5d3b3896e7e5db358c4ec48b",
  "exercise": "5d35da3142c6445078cd03f2",
  "oneRM": 89
}];

function filterByWeek(data) {
    //  so just like with the days, here we want to get a limited amount of data (last 6 weeks or less);
    const weeksAgo6 = moment().startOf('week').subtract(6, 'weeks').toDate();
    console.log('data', data);
    const filteredData = data.filter((item) => moment(item.date).isAfter(weeksAgo6));
    console.log('filter test1', data.filter((item) => moment(item.date).isAfter(weeksAgo6)));
    console.log('filter test2', filteredData);

    return filteredData;
};

filterByWeek(data);
<script src="https://cdn.jsdelivr.net/npm/moment@2.24.0/min/moment.min.js"></script>


推荐阅读