Javascript 基于另一个对象数组过滤对象数组中的数据

Javascript 基于另一个对象数组过滤对象数组中的数据,javascript,arrays,node.js,object,filter,Javascript,Arrays,Node.js,Object,Filter,我有任何对象数组: 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: "bd

我有任何对象数组:

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非常大。 然后,如果policy字段array1与insuredPolicy array2匹配,则创建对象数组&array1中的date字段与array2中的sDate匹配

因此,输出将是:

array3 = [
{ policy: "qwe", date: "20-05-2019" },
{ policy: "bdd", date: "04-05-2019" },
];
在学习阶段,任何帮助都会被感激

编辑

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

提前感谢。

您可以使用array1上的Arrayfilter和array2上的Arraysome来过滤所需的元素

const array1=[{id:1,政策:abc,日期:20-05-2019},{id:4,政策:hjk,日期:12-05-2019},{id:5,政策:ikl,日期:08-05-2019},{id:7,政策:qwe,日期:20-05-2019},{id:8,政策:bdd,日期:04-05-2019},] const array2=[{信息:{保险单:qwe,},日期:{sDate:'20-05-2019',eDate:'20-06-2019'}, {信息:{被保险保单:ikl,},日期:{sDate:'20-05-2019',eDate:'20-06-2019'},{信息:{被保险保单:bbb,},日期:{sDate:'20-05-2019',eDate:'20-06-2019'},{信息:{被保险保单:bdd,},日期:{sDate:'04-05-2019',eDate:'20-05-2019},]; 放出来=array1.filter{policy,date}=>array2.somee=>e.info.insuredPolicy==policy&&e.date.sDate==date; console.logout您可以使用array1上的Arrayfilter和array2上的Arraysome来过滤掉所需的元素

const array1=[{id:1,政策:abc,日期:20-05-2019},{id:4,政策:hjk,日期:12-05-2019},{id:5,政策:ikl,日期:08-05-2019},{id:7,政策:qwe,日期:20-05-2019},{id:8,政策:bdd,日期:04-05-2019},] const array2=[{信息:{保险单:qwe,},日期:{sDate:'20-05-2019',eDate:'20-06-2019'}, {信息:{被保险保单:ikl,},日期:{sDate:'20-05-2019',eDate:'20-06-2019'},{信息:{被保险保单:bbb,},日期:{sDate:'20-05-2019',eDate:'20-06-2019'},{信息:{被保险保单:bdd,},日期:{sDate:'04-05-2019',eDate:'20-05-2019},]; 放出来=array1.filter{policy,date}=>array2.somee=>e.info.insuredPolicy==policy&&e.date.sDate==date; console.logout您可以使用.reduce根据您的条件创建新数组

变量数组1=[ {id:1,政策:abc,日期:20-05-2019}, {id:4,政策:hjk,日期:2019年5月12日}, {id:5,政策:ikl,日期:2019年5月8日}, {id:7,政策:qwe,日期:20-05-2019}, {id:8,政策:bdd,日期:2019年5月4日}, ] 变量array2=[ { 信息:{投保单:qwe,}, 日期:{sDate:20-05-2019,eDate:20-06-2019} }, { 信息:{投保单:ikl,}, 日期:{sDate:20-05-2019,eDate:20-06-2019} }, { 信息:{投保单:bbb,}, 日期:{sDate:20-05-2019,eDate:20-06-2019} }, { 信息:{投保单:bdd,}, 日期:{日期:2019年5月4日,日期:2019年5月20日} }, ]; console.logarray2.reducearr,{info:{insuredPolicy},日期:{sDate}=>{ var item=array1.find{policy,date}=>insuredPolicy==policy&&sDate==date ifitem arr.push{policy:item.policy,date:item.date}//根据需要编辑 返回arr },[]您可以使用。reduce根据您的条件创建新阵列

变量数组1=[ {id:1,政策:abc,日期:20-05-2019}, {id:4,政策:hjk,日期:2019年5月12日}, {id:5,政策:ikl,日期:2019年5月8日}, {id:7,政策:qwe,日期:20-05-2019}, {id:8,政策:bdd,日期:2019年5月4日}, ] 变量array2=[ { 信息:{投保单:qwe,}, 日期:{sDate:20-05-2019,eDate:20-06-2019} }, { 信息:{投保单:ikl,}, 日期:{sDate:20-05-2019,eDate:20-06-2019} }, { 信息:{投保单:bbb,}, 日期:{sDate:20-05-2019,eDate:20-06-2019} }, { 信息:{投保单:bdd,}, 日期:{日期:2019年5月4日,日期:2019年5月20日} }, ]; console.logarray2.reducearr,{info:{insuredPolicy},日期:{sDate}=>{ var item=array1.find{policy,date}=>insuredPolicy==policy&&sDate==date ifitem arr.push{policy:item.policy,date:item.date}//根据需要编辑 返回arr
},[]您可以使用过滤器和映射

因为您提到第二个数组非常大,所以每次通过完整数组进行搜索都会增加时间复杂性 因此,使用map将第二个数组映射到一个键、值对中 基于Mapper中的值从array1中筛选值 const array1=[{id:1,政策:abc,日期:20-05-2019},{id:4,政策:hjk,日期:12-05-2019},{id:5,政策:ikl,日期:08-05-2019},{id:7,政策:qwe,日期:20-05-2019},{id:8,政策:bdd,日期:04-05-2019},] const array2=[{信息:{保险单:qwe,},日期:{sDate:'20-05-2019',eDate:'20-06-2019'}, {信息:{投保单:ikl,},日期:{sDate:'20-05-2019',eDate:'20-06-2019'},{信息:{投保单:bbb,},日期:{ sDate:'20-05-2019',eDate:'20-06-2019'},{信息:{保险单:bdd,},日期:{sDate:'04-05-2019',eDate:'20-05-2019'},]; const mapper=new Maparray2.map{ 信息, 日期 }=>[info.insuredPolicy,date.sDate] 常量final=array1.filter{ 政策 日期 } => { if mapper.haspolicy{ 返回mapper.getpolicy==日期 } }
console.logfinal您可以使用过滤器和映射

因为您提到第二个数组非常大,所以每次通过完整数组进行搜索都会增加时间复杂性 因此,使用map将第二个数组映射到一个键、值对中 基于Mapper中的值从array1中筛选值 const array1=[{id:1,政策:abc,日期:20-05-2019},{id:4,政策:hjk,日期:12-05-2019},{id:5,政策:ikl,日期:08-05-2019},{id:7,政策:qwe,日期:20-05-2019},{id:8,政策:bdd,日期:04-05-2019},] const array2=[{信息:{保险单:qwe,},日期:{sDate:'20-05-2019',eDate:'20-06-2019'}, {信息:{被保险保单:ikl,},日期:{sDate:'20-05-2019',eDate:'20-06-2019'},{信息:{被保险保单:bbb,},日期:{sDate:'20-05-2019',eDate:'20-06-2019'},{信息:{被保险保单:bdd,},日期:{sDate:'04-05-2019',eDate:'20-05-2019},]; const mapper=new Maparray2.map{ 信息, 日期 }=>[info.insuredPolicy,date.sDate] 常量final=array1.filter{ 政策 日期 } => { if mapper.haspolicy{ 返回mapper.getpolicy==日期 } }
console.logfinal您可以将一个对象作为映射,第一个数组递增,第二个数组递减。最后,只获取值为零的键,并将该键解析为新对象的JSON

var array1=[{id:1,政策:abc,日期:20-05-2019},{id:4,政策:hjk,日期:12-05-2019},{id:5,政策:ikl,日期:08-05-2019},{id:7,政策:qwe,日期:20-05-2019},{id:8,政策:bdd,日期:04-05-2019}], array2=[{info:{insuredPolicy:qwe},日期:{sDate:20-05-2019,eDate:20-06-2019},{info:{insuredPolicy:ikl},日期:{sDate:20-05-2019,eDate:20-06-2019},{info:{insuredPolicy:bbb},日期:{sDate:20-05-2019,eDate:20-06-2019,日期:{, wrapper1={policy,date}=>JSON.stringify{policy,date}, wrapper2={info:{insuredPolicy:policy},日期:{sDate:date}=>JSON.stringify{policy,date}, map=Object.createnull, setMap=map,wrapper,value=>object=>key=>map[key]=map[key]| | 0+valuewrapperobject, 后果 array1.forEachsetMapmap,wrapper1,1; array2.forEachsetMapmap,wrapper2,-1; 结果=对象 .entriesmap .filter[,v]=>!v .map[k]=>JSON.parsek; console.logresult;
.as console wrapper{max height:100%!important;top:0;}您可以将一个对象作为映射,第一个数组递增,第二个数组递减。最后,只获取值为零的键,并将该键解析为新对象的JSON

var array1=[{id:1,政策:abc,日期:20-05-2019},{id:4,政策:hjk,日期:12-05-2019},{id:5,政策:ikl,日期:08-05-2019},{id:7,政策:qwe,日期:20-05-2019},{id:8,政策:bdd,日期:04-05-2019}], array2=[{info:{insuredPolicy:qwe},日期:{sDate:20-05-2019,eDate:20-06-2019},{info:{insuredPolicy:ikl},日期:{sDate:20-05-2019,eDate:20-06-2019},{info:{insuredPolicy:bbb},日期:{sDate:20-05-2019,eDate:20-06-2019,日期:{, wrapper1={policy,date}=>JSON.stringify{policy,date}, wrapper2={info:{insuredPolicy:policy},日期:{sDate:date}=>JSON.stringify{policy,date}, map=Object.createnull, setMap=map,wrapper,value=>object=>key=>map[key]=map[key]| | 0+valuewrapperobject, 后果 array1.forEachsetMapmap,wrapper1,1; array2.forEachsetMapmap,wrapper2,-1; 结果=对象 .entriesmap .filter[,v]=>!v .map[k]=>JSON.parsek; console.logresult;
.作为控制台包装器{max height:100%!important;top:0;}需要进行小的编辑,需要将sDate减少一天,然后与日期进行比较。例如:如果sDate为2019年5月5日,则减少一天,并与数组1中的日期进行比较。@Vishnu也为此添加了解决方案。需要进行小的编辑,需要将sDate减少一天,然后与日期进行比较。例如:如果sDate为2019年5月5日,则减少一天,并与数组1中的日期进行比较。@Vishnu也为此添加了解决方案。需要进行小的编辑,需要将sDate减少一天,然后与日期进行比较。例如:如果sDate为2019年5月5日,则缩短一天,并与数组1中的日期进行比较。@Vishnu使用新日期解析日期,并以所需方式进行操作,或者如果您的项目有大量与日期相关的操作,请使用标准库(如moment或date fnscan)更新moment或date fns?这将是非常有帮助的。@毗湿奴,恕我直言,你必须先尝试至少一次,如果你
我的脸你可以在这里问,你将通过自己的实践来学习,尝试一下,如果你仍然面临困难,请告诉我,快乐编码是的,当然,你能让我知道你在这里用过的地图吗?我不明白。一个小的编辑需要讨论,需要减少一天的sDate,然后与日期比较。例如:如果sDate为2019年5月5日,则缩短一天,并与数组1中的日期进行比较。@Vishnu使用新日期解析日期,并以所需方式进行操作,或者如果您的项目有大量与日期相关的操作,请使用标准库(如moment或date fnscan)更新moment或date fns?这将非常有帮助。@Vishnu,恕我直言,你必须先尝试至少一次,如果你仍然面对,你可以在这里提问,你将通过自己的实践来学习,尝试一次,如果你仍然面临困难,请告诉我,快乐编码是的,当然,你可以让我知道你在这里用过的地图吗?我不明白。一个小的编辑需要讨论,需要减少一天的sDate,然后与日期比较。例如:如果sDate为2019年5月5日,则减少一天并与数组1中的日期进行比较。需要进行小规模编辑,则需要将sDate减少一天并与日期进行比较。例如:如果sDate为2019年5月5日,则缩短一天,并与阵列1中的日期进行比较。