javascript - Lodash - 过滤嵌套数组,传递函数

标签 javascript angularjs arrays nested lodash

我找不到一种方法来过滤和提取嵌套数组中与特定条件/表达式匹配的itens

我已经检查了下面的这些链接,但提供的解决方案不会将函数传递给 _.filter:

Find object by match property in nested array

lodash property search in array and in nested child arrays

Lodash - Search Nested Array and Return Object

那么,让我更好地解释一下。我目前的数据如下所示: 如何检索“listEvents”数组内所有符合条件的对象的itens?

[
  {
    "ModalidadeId": 1,
    "Nome": "SOCCER",
    "Ordem": "09",
    "IconeId": "",
    "listEvents": [
      {
        "EI": 2960542,
        "No": "SÃO PAULO SP X ATLÉTICO LINENSE-SP",
        "St": 1,
        "Ini": "2017-09-30T10:00:00",
        "MI": 1,
        "CI": 251,
        "TI": 4993,
        "StAV": 0,
        "De": false,
        "Ics": [
          "p22678",
          "p22684"
        ],
        "Ic": "",
        "Tas": [],
        "show": true,
        "IniFormatada": "30/09/2017 às 10:00:00",
        "MN": "FUTEBOL"
      },
      {
        "EI": 3260915,
        "No": "SÃO PAULO SP X ATLÉTICO LINENSE-SP",
        "St": 0,
        "Ini": "2017-09-30T10:00:00",
        "MI": 1,
        "CI": 251,
        "TI": 4993,
        "StAV": 0,
        "De": false,
        "Ics": [
          "p29076",
          "p22684"
        ],
        "Ic": "",
        "Tas": [],
        "show": true,
        "IniFormatada": "30/09/2017 às 10:00:00",
        "MN": "FUTEBOL"
      },
      {
        "EI": 430219,
        "No": "NOROESTE SP X GREMIO NOVORIZONTINO SP",
        "St": 0,
        "Ini": "2017-09-30T15:00:00",
        "MI": 1,
        "CI": 251,
        "TI": 2580,
        "StAV": 0,
        "De": false,
        "Ics": [
          "p31209",
          "p31113"
        ],
        "Ic": "",
        "Tas": [],
        "show": true,
        "IniFormatada": "30/09/2017 às 15:00:00",
        "MN": "FUTEBOL"
      },
      {
        "EI": 443844,
        "No": "COMERCIAL FC SP X BATATAIS FUTEBOL CLUBE SP",
        "St": 0,
        "Ini": "2017-09-30T15:00:00",
        "MI": 1,
        "CI": 251,
        "TI": 2580,
        "StAV": 0,
        "De": false,
        "Ics": [
          "p31200",
          "p31212"
        ],
        "Ic": "",
        "Tas": [],
        "show": true,
        "IniFormatada": "30/09/2017 às 15:00:00",
        "MN": "FUTEBOL"
      }
    ]
  },
  {
    "ModalidadeId": 2,
    "Nome": "TENIS",
    "Ordem": "09",
    "IconeId": "",
    "listEvents": [
      {
        "EI": 2960542,
        "No": "SÃO PAULO SP X ATLÉTICO LINENSE-SP",
        "St": 1,
        "Ini": "2017-09-30T10:00:00",
        "MI": 1,
        "CI": 251,
        "TI": 4993,
        "StAV": 0,
        "De": false,
        "Ics": [
          "p22678",
          "p22684"
        ],
        "Ic": "",
        "Tas": [],
        "show": true,
        "IniFormatada": "30/09/2017 às 10:00:00",
        "MN": "FUTEBOL"
      },
      {
        "EI": 3260915,
        "No": "SÃO PAULO SP X ATLÉTICO LINENSE-SP",
        "St": 0,
        "Ini": "2017-09-30T10:00:00",
        "MI": 1,
        "CI": 251,
        "TI": 4993,
        "StAV": 0,
        "De": false,
        "Ics": [
          "p29076",
          "p22684"
        ],
        "Ic": "",
        "Tas": [],
        "show": true,
        "IniFormatada": "30/09/2017 às 10:00:00",
        "MN": "FUTEBOL"
      },
      {
        "EI": 430219,
        "No": "NOROESTE SP X GREMIO NOVORIZONTINO SP",
        "St": 0,
        "Ini": "2017-09-30T15:00:00",
        "MI": 1,
        "CI": 251,
        "TI": 2580,
        "StAV": 0,
        "De": false,
        "Ics": [
          "p31209",
          "p31113"
        ],
        "Ic": "",
        "Tas": [],
        "show": true,
        "IniFormatada": "30/09/2017 às 15:00:00",
        "MN": "FUTEBOL"
      },
      {
        "EI": 443844,
        "No": "COMERCIAL FC SP X BATATAIS FUTEBOL CLUBE SP",
        "St": 0,
        "Ini": "2017-09-30T15:00:00",
        "MI": 1,
        "CI": 251,
        "TI": 2580,
        "StAV": 0,
        "De": false,
        "Ics": [
          "p31200",
          "p31212"
        ],
        "Ic": "",
        "Tas": [],
        "show": true,
        "IniFormatada": "30/09/2017 às 15:00:00",
        "MN": "FUTEBOL"
      }
    ]
  }
]

这是我到目前为止尝试过的代码,但它似乎不起作用。

_.filter($scope.listModalities, _.flow(
            _.property('listEvents'),
            _.partialRight(_.filter, function (o) {
              var eventDate = new Date(o.Ini);
              eventDate.setHours(eventDate.getHours() - 24);
              var now = new Date();
              return o.De == true || eventDate < now;
            })
          ));

最佳答案

如果您映射listEvents,然后展平,您可以摆脱一个迭代循环并获得您想要的结果,如下所示:

var now = new Date();
var listEvents = _.chain(input).map((o) => o.listEvents).flatten().filter((o)=> {
  if(o.De === true) return true;
  var eventDate = new Date(o.Ini);
  eventDate.setHours(eventDate.getHours() - 24);
  return eventDate < now;
}).value();

now = null;

此外,您还会注意到我移动了相等性检查o.De === true,这样如果它是true,函数将返回而无需额外计算。此外,也是为了提高效率,我将 now 的定义移出了迭代。

这是一个pen还有。

此外,这是它在 es5 中的样子。

var now = new Date();
var listEvents = _.chain(input).map(function (o) {
  return o.listEvents;
}).flatten().filter(function (o) {
  if (o.De === true) return true;
  var eventDate = new Date(o.Ini);
  eventDate.setHours(eventDate.getHours() - 24);
  return eventDate < now;
}).value();

还有pen一起去。

此外,正如评论中所建议的,您可以使用 flatMap 节省另一个步骤:

var now = new Date();
var listEvents = _.chain(input).flatMap('listEvents').filter(function (o) {
  if (o.De === true) return true;
  var eventDate = new Date(o.Ini);
  eventDate.setHours(eventDate.getHours() - 24);
  return eventDate < now;
}).value();

console.log(listEvents);

pen

关于javascript - Lodash - 过滤嵌套数组,传递函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46498608/

相关文章:

javascript - 无法更改页面中的对象值,但在控制台日志中显示为工作(AngularJS)

c - 为什么我们不能使用动态数组作为使用静态数组参数的函数的参数?

javascript - JS 双取条件

javascript - 以二维码为列的 HTML 表格;平板电脑上的加载问题

javascript - 如何使用PHP动态显示时间?

javascript - Angular 为所有站点运行 jQuery 代码

javascript - 使用 onClick 调用 jquery 函数

angularjs - 如何通过标记中的 Angular 表达式过滤到数组中的单个项目?

c - 将整数存储在 char 数组中

java - Java中是否有内置方法可以将字符串转换为整数数组?