我有任何对象数组:
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天,然后进行比较。我们如何实现这一目标?
谢谢。
答案 0 :(得分:3)
您可以使用过滤器和地图
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
}, []))