繁体   English   中英

根据另一个对象数组从对象数组中过滤数据

[英]filter data from an array of objects based on another array of objects

我有任何对象数组:

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 进行比较(假设 array2 非常大)。 然后,如果策略字段 (array1) 与参保政策 (array2) 匹配并且数组 1 中的日期字段与数组 2 中的 sDate 匹配,则创建对象数组

所以 output 将是:

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

在学习阶段,任何帮助将不胜感激。

编辑

如何比较 array2 是否提前一天包含 sDate? 如果是这样,则将 sDate 减少 1 天,然后进行比较。 我们怎样才能做到这一点?

提前致谢。

您可以使用过滤器和 Map

  1. 由于您提到第二个数组非常大,因此每次搜索完整数组都会增加时间复杂度
  2. 所以 map 使用 Map 将第二个数组转换为键值对
  3. 根据 Mapper 中存在的值过滤来自 array1 的值

 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)

您可以在 array1 上使用Array#filter和在 array2 上使用Array#some来过滤掉所需的元素。

 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)

您可以将 object 作为 map 并为第一个数组增加并为第二个数组减少。 最后只取值为零的键并将键解析为 JSON 以获得新的 object。

 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; }

您可以使用.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 }, []))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM