我找不到一种方法来过滤和提取嵌套数组中与特定条件/表达式匹配的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);
关于javascript - Lodash - 过滤嵌套数组,传递函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46498608/