[英]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?如何创建一个结果数组,其中仅提供来自报价数组的报价,该数组在 dateRange 数组中具有每一天的条目?
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,...该解决方案必须在 IE11 中工作 - 没有箭头功能,...
EDIT: If I have offers array like the below, your function gives me wrong results.编辑:如果我提供如下数组,您的 function 会给我错误的结果。
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.使用 Set() 跟踪找到的 Day 匹配项,并返回包含所有匹配项的 DeskUID Days。 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.您没有 state 如何处理骗子,所以如果您想要包含非匹配项,我只是将它们包括在内,如果您只想要匹配项则排除。
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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.