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

时间:2020-05-01 11:31:06

标签: javascript arrays node.js object filter

我有任何对象数组:

convertView

我还有另一个这样的大数组:

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" },
]

我想比较array1中的所有策略字段和日期字段与array2(假设array2非常大)。 然后,如果策略字段(array1)与insuredPolicy(array2)相匹配,并且array1中的date字段与array2中的sDate相匹配,则创建对象数组

所以输出将是:

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

在学习阶段,我们将不胜感激。

编辑

如何比较array2提前一天是否包含sDate?如果是这样,则将sDate减少1天,然后进行比较。我们如何实现这一目标?

谢谢。

4 个答案:

答案 0 :(得分:3)

您可以使用过滤器和地图

  1. 由于您提到第二个数组非常大,因此每次搜索完整数组都会增加时间复杂度
  2. 因此,使用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)

答案 1 :(得分:2)

您可以在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)

答案 2 :(得分:1)

您可以将一个对象作为映射,并将firts数组作为增量,将第二个对象作为递减。最后,仅取值为零的键,然后将键解析为新对象的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; }

答案 3 :(得分: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
}, []))