2017-09-30 17 views
0

함수를 통과, 중첩 된 배열을 필터링/표현하지만, 전달 함수를 제공하지 않을 솔루션 _.filter한다 :Lodash - 내가 아래에 이러한 링크를 확인했습니다</p> <p>나는 필터링하고 특정 기준과 일치하는 중첩 배열만을 itens를 추출 할 수있는 방법을 찾을 수 없습니다

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; 
      }) 
     )); 
+1

이의 예를 제공 자바 스크립트 방법 : 코멘트에 제안 된대로

또한, 당신은 flatMap 또 다른 단계를 절약 할 수 있습니다 기준 및 그 기준을 사용한 필터링 후의 출력. –

+0

중첩 된 객체 만있는 결과가 필요하거나 부모 객체를 갖기 위해 결과가 필요합니까? 샘플 출력은 큰 도움이 될 것입니다 – user93

답변

1

경우 map 하나 개의 반복 루프를 제거하고 결과를 얻을 얻을 수있는 다음 flattenlistEvents에 당신과 같이합니다 :

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.

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

+0

ES5 구현은 어떻게 될 것입니까? –

+0

안녕하세요 @ 루카스 폰세카, 덧붙였다^ –

+0

고마워요! 그것은 매력처럼 일했습니다! –

1

은 어쩌면 당신은 바닐라를 시도 할 수

var listEvents = [] 

myData.forEach((item) => { 
item.listEvents.forEach((event) => { 
    var eventDate = new Date(event.Ini); 
    eventDate.setHours(eventDate.getHours() - 24); 
    var now = new Date(); 
    if(event.De == true || eventDate < now){ 
     listEvents.push(event); 
    } 
    }) 
})