фильтровать данные из массива объектов на основе другого массива объектов - PullRequest
1 голос
/ 01 мая 2020

У меня есть любой массив объектов:

array1 = [
    {id: "1", policy: "abc", date: "20-05-2019" },
    {id: "4", policy: "hjk", date: "12-05-2019" },
    {id: "5", policy: "ikl", date: "08-05-2019" },
    {id: "7", policy: "qwe", date: "20-05-2019" },
    {id: "8", policy: "bdd", date: "04-05-2019" },
]

У меня есть еще один большой массив, подобный этому:

array2 = [
 {
   "info" : { "insuredPolicy" : "qwe", },
   "date" : { "sDate" : 20-05-2019, "eDate" : 20-06-2019 }
 },
 {
   "info" : { "insuredPolicy" : "ikl", },
   "date" : { "sDate" : 20-05-2019, "eDate" : 20-06-2019 }
 },
{
   "info" : { "insuredPolicy" : "bbb", },
   "date" : { "sDate" : 20-05-2019, "eDate" : 20-06-2019 }
 },
{
   "info" : { "insuredPolicy" : "bdd", },
   "date" : { "sDate" : 04-05-2019, "eDate" : 20-05-2019 }
 },
];

Я хочу сравнить все поля политики и поля даты в array1 с array2 (предположим, массив2 очень большой). затем создайте массив объектов, если поле политики (array1) совпадает с insuredPolicy (array2), а поле даты в array1 совпадает с sDate в array2

, поэтому выходные данные будут:

array3 = [
{ policy: "qwe", date: "20-05-2019" },
{ policy: "bdd", date: "04-05-2019" },
];

При обучении фаза, любая помощь будет очень признательна.

РЕДАКТИРОВАТЬ

Как сравнить, если array2 содержит sDate на один день вперед? Если так, то уменьшите sDate на 1 день и затем сравните. Как мы можем этого добиться?

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 01 мая 2020

Вы можете использовать фильтр и карту

  1. Поскольку вы упомянули, что второй массив очень большой, поэтому поиск каждый раз по всему массиву увеличивает сложность времени
  2. Так что сопоставьте второй массив с ключом , пара значений с использованием Map
  3. Фильтрация значений из массива1 на основе значений, представленных в Mapper

const array1 = [{id: "1", policy: "abc", date: "20-05-2019" },{id: "4", policy: "hjk", date: "12-05-2019" },{id: "5", policy: "ikl", date: "08-05-2019" },{id: "7", policy: "qwe", date: "20-05-2019" },{id: "8", policy: "bdd", date: "04-05-2019" },]

const array2 = [{"info" : { "insuredPolicy" : "qwe", },"date" : { "sDate" : '20-05-2019', "eDate" : '20-06-2019' }},
{"info" : { "insuredPolicy" : "ikl", },"date" : { "sDate" : '20-05-2019', "eDate" : '20-06-2019' }},{"info" : { "insuredPolicy" : "bbb", },"date" : { "sDate" : '20-05-2019', "eDate" : '20-06-2019' }},{"info" : { "insuredPolicy" : "bdd", },"date" : { "sDate" : '04-05-2019', "eDate" : '20-05-2019' }},];

const mapper = new Map(array2.map(({
  info,
  date
}) => [info.insuredPolicy, date.sDate]))

const final = array1.filter(({
  policy,
  date
}) => {
  if (mapper.has(policy)) {
    return mapper.get(policy) === date
  }
})

console.log(final)
2 голосов
/ 01 мая 2020

вы можете использовать Array#filter для массива1 с Array#some для массива2 для фильтрации необходимых элементов.

const array1 = [{id: "1", policy: "abc", date: "20-05-2019" },{id: "4", policy: "hjk", date: "12-05-2019" },{id: "5", policy: "ikl", date: "08-05-2019" },{id: "7", policy: "qwe", date: "20-05-2019" },{id: "8", policy: "bdd", date: "04-05-2019" },]

const array2 = [{"info" : { "insuredPolicy" : "qwe", },"date" : { "sDate" : '20-05-2019', "eDate" : '20-06-2019' }},
{"info" : { "insuredPolicy" : "ikl", },"date" : { "sDate" : '20-05-2019', "eDate" : '20-06-2019' }},{"info" : { "insuredPolicy" : "bbb", },"date" : { "sDate" : '20-05-2019', "eDate" : '20-06-2019' }},{"info" : { "insuredPolicy" : "bdd", },"date" : { "sDate" : '04-05-2019', "eDate" : '20-05-2019' }},];


 let out = array1.filter(({policy, date}) => array2.some(e => e.info.insuredPolicy === policy && e.date.sDate === date));
 console.log(out)

РЕДАКТИРОВАТЬ: В соответствии с новым требованием

вы можете написать метод для получения предыдущей строки даты следующим образом

const array1 = [{id: "1", policy: "abc", date: "20-05-2019" },{id: "4", policy: "hjk", date: "12-05-2019" },{id: "5", policy: "ikl", date: "08-05-2019" },{id: "7", policy: "qwe", date: "20-05-2019" },{id: "8", policy: "bdd", date: "04-05-2019" },]

const array2 = [{"info" : { "insuredPolicy" : "qwe", },"date" : { "sDate" : '21-05-2019', "eDate" : '20-06-2019' }},
{"info" : { "insuredPolicy" : "ikl", },"date" : { "sDate" : '20-05-2019', "eDate" : '20-06-2019' }},{"info" : { "insuredPolicy" : "bbb", },"date" : { "sDate" : '20-05-2019', "eDate" : '20-06-2019' }},{"info" : { "insuredPolicy" : "bdd", },"date" : { "sDate" : '04-05-2019', "eDate" : '20-05-2019' }},];


function yesterday(str) {
  return str.replace(/\d{2}/, (p1) => (p1 - 1).toString().padStart(2, 0))
}

let out = array1.filter(({policy, date}) => array2.some(e => e.info.insuredPolicy === policy && yesterday(e.date.sDate) === date));
 console.log(out)
1 голос
/ 01 мая 2020

Вы можете взять объект в качестве карты и приращения для первого массива и уменьшения для второго. В конце возьмите только ключи со значением ноль и проанализируйте ключ как JSON для нового объекта.

var array1 = [{ id: "1", policy: "abc", date: "20-05-2019" }, { id: "4", policy: "hjk", date: "12-05-2019" }, { id: "5", policy: "ikl", date: "08-05-2019" }, { id: "7", policy: "qwe", date: "20-05-2019" }, { id: "8", policy: "bdd", date: "04-05-2019" }],
    array2 = [{ info: { insuredPolicy: "qwe" }, date: { sDate: "20-05-2019", eDate: "20-06-2019" } }, { info: { insuredPolicy: "ikl" }, date: { sDate: "20-05-2019", eDate: "20-06-2019" } }, { info: { insuredPolicy: "bbb" }, date: { sDate: "20-05-2019", eDate: "20-06-2019" } }, { info: { insuredPolicy: "bdd" }, date: { sDate: "04-05-2019", eDate: "20-05-2019" } }],
    wrapper1 = ({ policy, date }) => JSON.stringify({ policy, date }),
    wrapper2 = ({ info: { insuredPolicy: policy }, date: { sDate: date } }) => JSON.stringify({ policy, date }),
    map = Object.create(null),
    setMap = (map, wrapper, value) => object => (key => map[key] = (map[key] || 0) + value)(wrapper(object)),
    result;

array1.forEach(setMap(map, wrapper1, 1));
array2.forEach(setMap(map, wrapper2, -1));

result = Object
    .entries(map)
    .filter(([, v]) => !v)
    .map(([k]) => JSON.parse(k));

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 01 мая 2020

Вы можете использовать .reduce() для создания нового массива на основе ваших условий

var array1 = [
    {id: "1", policy: "abc", date: "20-05-2019" },
    {id: "4", policy: "hjk", date: "12-05-2019" },
    {id: "5", policy: "ikl", date: "08-05-2019" },
    {id: "7", policy: "qwe", date: "20-05-2019" },
    {id: "8", policy: "bdd", date: "04-05-2019" },
]

var array2 = [
 {
   "info" : { "insuredPolicy" : "qwe", },
   "date" : { "sDate" : "20-05-2019", "eDate" : "20-06-2019" }
 },
 {
   "info" : { "insuredPolicy" : "ikl", },
   "date" : { "sDate" : "20-05-2019", "eDate" : "20-06-2019" }
 },
{
   "info" : { "insuredPolicy" : "bbb", },
   "date" : { "sDate" : "20-05-2019", "eDate" : "20-06-2019" }
 },
{
   "info" : { "insuredPolicy" : "bdd", },
   "date" : { "sDate" : "04-05-2019", "eDate" : "20-05-2019" }
 },
];

console.log(array2.reduce((arr, { info: { insuredPolicy }, date: { sDate } }) => {
  var item = array1.find(({ policy, date }) => insuredPolicy == policy && sDate == date)
  if(item) arr.push({ policy: item.policy, date: item.date }) // edit as you want
  return arr
}, []))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...