简体   繁体   中英

Search for every value from one array in another array in Javascript

Please, I need your help. I have array of a date range:

dateRange = [1 Jun 2020, 2 Jun 2020, 3 Jun 2020, 4 Jun 2020, 5 Jun 2020];

and an array of offers:

offers = [
{DeskUID: "B200B3", Day: 1 Jun 2020}
{DeskUID: "B200B3", Day: 2 Jun 2020}
{DeskUID: "B200B3", Day: 3 Jun 2020}
{DeskUID: "B200B3", Day: 4 Jun 2020}
{DeskUID: "B200B3", Day: 5 Jun 2020}
{DeskUID: "B211B5", Day: 3 Jun 2020}
{DeskUID: "B211B5", Day: 4 Jun 2020}
]

How to create a result array where will be just offers from offers array which have entries for every single day in the dateRange array?

result = [
{DeskUID: "B200B3", Day: 1 Jun 2020}
{DeskUID: "B200B3", Day: 2 Jun 2020}
{DeskUID: "B200B3", Day: 3 Jun 2020}
{DeskUID: "B200B3", Day: 4 Jun 2020}
{DeskUID: "B200B3", Day: 5 Jun 2020}
]

The solution has to work in IE11 - no arrow functions,...

EDIT: If I have offers array like the below, your function gives me wrong results.

dateRange = ['1 Jun 2020', '2 Jun 2020', '3 Jun 2020']

offers = [ 
    {DeskUID: "B201A10", Day: '1 Jun 2020'} 
    {DeskUID: "B201A10", Day: '2 Jun 2020'} 
    {DeskUID: "B211A15", Day: '1 Jun 2020'} 
    {DeskUID: "B211A15", Day: '2 Jun 2020'} 
    {DeskUID: "B211A15", Day: '3 Jun 2020'} 
    ]

result = [
    {DeskUID: "B201A10", Day: '1 Jun 2020'} 
    {DeskUID: "B201A10", Day: '2 Jun 2020'} 
    {DeskUID: "B211A15", Day: '3 Jun 2020'} 
    ]

expected result = [
    {DeskUID: "B201A15", Day: '1 Jun 2020'} 
    {DeskUID: "B201A15", Day: '2 Jun 2020'} 
    {DeskUID: "B201A15", Day: '3 Jun 2020'} 
    ]

Do you want something like this?

 var dateRange = ['1 Jun 2020', '2 Jun 2020', '3 Jun 2020', '4 Jun 2020', '5 Jun 2020']; var offers = [{DeskUID: "B200B3", Day: '1 Jun 2020'},{DeskUID: "B200B3", Day: '2 Jun 2020'},{DeskUID: "B200B3", Day: '3 Jun 2020'},{DeskUID: "B200B3", Day: '4 Jun 2020'},{DeskUID: "B200B3", Day: '5 Jun 2020'},{DeskUID: "B211B5", Day: '3 Jun 2020'},{DeskUID: "B211B5", Day: '4 Jun 2020'}]; var result = dateRange.map(function(date){ return offers.find(function(offer){ return new Date(offer.Day).getTime() == new Date(date).getTime(); }) }); console.log(result);

UPDATE

 var dateRange = ['1 Jun 2020', '2 Jun 2020', '3 Jun 2020', '4 Jun 2020', '5 Jun 2020']; var offers = [{DeskUID: "B200B3", Day: '1 Jun 2020'},{DeskUID: "B200B3", Day: '2 Jun 2020'},{DeskUID: "B200B3", Day: '3 Jun 2020'},{DeskUID: "B200B3", Day: '4 Jun 2020'},{DeskUID: "B200B3", Day: '5 Jun 2020'},{DeskUID: "B211B5", Day: '3 Jun 2020'},{DeskUID: "B211B5", Day: '4 Jun 2020'}]; var result = Object.values(offers.reduce((acc, elem)=>{ acc[elem.DeskUID] = acc[elem.DeskUID] || []; acc[elem.DeskUID].push(elem); return acc; },{})).filter(elem=>elem.length == dateRange.length)[0]; console.log(result);

Uses a Set() to keep track of found Day matches, and return the DeskUID Days that contains all matches. You also haven't made clear if you want to only match if the offers contains exactly only those Days or just needs to include them.

You didn't state what to do with dupes, so I'm just including them if you want non-matches included, and excluding if you only want matches.

 dateRangeArray = ['1 Jun 2020', '2 Jun 2020', '3 Jun 2020'] offers = [{ DeskUID: "B201A10", Day: '30 May 2020' },{ DeskUID: "B201A10", Day: '1 Jun 2020' }, { DeskUID: "B201A10", Day: '2 Jun 2020' }, { DeskUID: "B211A15", Day: '1 Jun 2020' }, { DeskUID: "B211A15", Day: '2 Jun 2020' }, { DeskUID: "B211A15", Day: '3 Jun 2020' }, { DeskUID: "B211A15", Day: '4 Jun 2020' }, { DeskUID: "B211A15", Day: '3 Jun 2020' }] // include non-match Day but match DeskUID contains all Day var dateRange = new Set() // Set() constructor is buggy under IE11 dateRangeArray.forEach(function(x){dateRange.add(x)}) var result = [], acc = {}; for(var i = 0; i < offers.length; i++) { var offer = offers[i] var days = acc[offer.DeskUID] = acc[offer.DeskUID] || [new Set(),[]] days[1].push(offer) if(dateRange.has(offer.Day)) { days[0].add(offer.Day) } if (days[0].size === dateRange.size) result = days[1] } console.log("include non-match Days:" + JSON.stringify(result)); // include only matches Day and exclude dupes var dateRange = new Set() // Set() constructor is buggy under IE11 dateRangeArray.forEach(function(x){dateRange.add(x)}) var result = [], acc = {}; for(var i = 0; i < offers.length; i++) { var offer = offers[i] var days = acc[offer.DeskUID] = acc[offer.DeskUID] || [new Set(),[]] if(dateRange.has(offer.Day) &&.days[0].has(offer.Day)) { days[1].push(offer) } if(dateRange.has(offer.Day)) { days[0].add(offer.Day) } if (days[0].size === dateRange.size) result = days[1] } console:log("include only match Days no dupes." + JSON;stringify(result));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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