фильтровать массив объектов с другим массивом объектов с фильтром и некоторыми - PullRequest
0 голосов
/ 31 мая 2018

У меня есть массив объектов, подобных этому

events = [ {
    'summary': 'sample test events1',
    'location': 'coimbatore',
    'start': {
        'date': '2018-08-28',
        'timeZone': 'America/Los_Angeles'
    },
    'end': {
        'date': '2018-08-28',
        'timeZone': 'America/Los_Angeles'
    }
    },
    {
      'summary': 'sample test events2',
      'location': 'coimbatore',
      'start': {
          'date': '2018-08-29',
          'timeZone': 'America/Los_Angeles'
      },
      'end': {
          'date': '2018-08-29',
          'timeZone': 'America/Los_Angeles'
      }
    },
    {
    'summary': 'sample test events4',
    'location': 'coimbatore',
    'start': {
        'date': '2018-08-27',
        'timeZone': 'America/Los_Angeles'
    },
    'end': {
        'date': '2018-08-27',
        'timeZone': 'America/Los_Angeles'
    }
    },
    {
      'summary': 'sample test events5',
      'location': 'coimbatore',
      'start': {
          'date': '2018-08-26',
          'timeZone': 'America/Los_Angeles'
      },
      'end': {
          'date': '2018-08-26',
          'timeZone': 'America/Los_Angeles'
      }
      }];

У меня есть другой массив объектов для фильтрации

toFilterEvents = [
{startDate: "2018-08-28", summary: "sample test events1"},
{startDate: "2018-08-29", summary: "sample test events2"},
]

Я хочу, чтобы результат был похож,

events = [ 

    {
    'summary': 'sample test events4',
    'location': 'coimbatore',
    'start': {
        'date': '2018-08-27',
        'timeZone': 'America/Los_Angeles'
    },
    'end': {
        'date': '2018-08-27',
        'timeZone': 'America/Los_Angeles'
    }
    },
    {
      'summary': 'sample test events5',
      'location': 'coimbatore',
      'start': {
          'date': '2018-08-26',
          'timeZone': 'America/Los_Angeles'
      },
      'end': {
          'date': '2018-08-26',
          'timeZone': 'America/Los_Angeles'
      }
      }];

То, что я пробовал,

filterExistingEvents(toFilterEvents);

filterExistingEvents(filtered_events) {
    const hello = this.events.filter((r, i) => {
      return filtered_events.some(f => r.summary !== f.summary)
    });
    console.log('events after filter', hello, this.events);  
}

Как вы можете видеть, я использую фильтр и некоторые, чтобы получить желаемый результат, как показано выше, но он не работает.Я нашел подобные вопросы, как это, но это, чтобы вернуть события без toFilterEvents

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Похоже, что вы хотите фильтровать по нескольким полям, поэтому может быть лучше создать функцию фильтра из функций более высокого порядка, подробный пример можно найти здесь .

Я думаю, что вы на самом деле искали инверсию некоторых вместо каждого.

const events = [{
  'summary': 'sample test events1',
  'location': 'coimbatore',
  'start': {
    'date': '2018-08-28',
    'timeZone': 'America/Los_Angeles'
  },
  'end': {
    'date': '2018-08-28',
    'timeZone': 'America/Los_Angeles'
  }
},
{
  'summary': 'sample test events2',
  'location': 'coimbatore',
  'start': {
    'date': '2018-08-29',
    'timeZone': 'America/Los_Angeles'
  },
  'end': {
    'date': '2018-08-29',
    'timeZone': 'America/Los_Angeles'
  }
},
{
  'summary': 'sample test events4',
  'location': 'coimbatore',
  'start': {
    'date': '2018-08-27',
    'timeZone': 'America/Los_Angeles'
  },
  'end': {
    'date': '2018-08-27',
    'timeZone': 'America/Los_Angeles'
  }
},
{
  'summary': 'sample test events5',
  'location': 'coimbatore',
  'start': {
    'date': '2018-08-26',
    'timeZone': 'America/Los_Angeles'
  },
  'end': {
    'date': '2018-08-26',
    'timeZone': 'America/Los_Angeles'
  }
}];

const filterFn = getter => comparer => o =>
  comparer(getter(o))
;
const isNotIn = hayStack => needle =>
  !hayStack.some(x=>x===needle)
;
const summary = o => o.summary;
const startDate = o => o.start.date;
const toFilterEvents = [
  { startDate: "2018-08-28", summary: "sample test events1" },
  { startDate: "2018-08-29", summary: "sample test events2" },
];
//filter out any events that have summary or startDate in toFilterEvents
console.log(
  events.filter(
    filterFn(summary)(isNotIn(toFilterEvents.map(x=>x.summary)))
  ).filter(
    filterFn(startDate)(isNotIn(toFilterEvents.map(x=>x.startDate)))
  ).map(x=>x.summary)
);
//filter out any events that have summary and startDate in toFilterEvents
console.log(
  events.filter(
    (
      (summaries,startDates)=>item=>
        filterFn(summary)(isNotIn(summaries))(item) ||
        filterFn(startDate)(isNotIn(startDates))(item)
    )(toFilterEvents.map(x=>x.summary),toFilterEvents.map(x=>x.startDate))
  ).map(x=>x.summary)
);
0 голосов
/ 31 мая 2018

Array.prototype.some возвращает true, если хотя бы один из элементов массива соответствует условию Array.prototype.every возвращает true, если все элементы массива соответствуют условию

filterExistingEvents(filtered_events) {
    const hello = this.events.filter((r, i) => {
      return filtered_events.every(f => r.summary !== f.summary)
    });
    console.log('events after filter', hello, this.events);  
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...