繁体   English   中英

在 Javascript 中的另一个数组中搜索一个数组中的每个值

[英]Search for every value from one array in another array in Javascript

拜托我需要你的帮忙。 我有一个日期范围的数组:

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

以及一系列优惠:

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

如何创建一个结果数组,其中仅提供来自报价数组的报价,该数组在 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}
]

该解决方案必须在 IE11 中工作 - 没有箭头功能,...

编辑:如果我提供如下数组,您的 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'} 
    ]

你想要这样的东西吗?

 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);

更新

 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);

使用 Set() 跟踪找到的 Day 匹配项,并返回包含所有匹配项的 DeskUID Days。 如果您只想匹配报价仅包含那些日子或只需要包含它们,您也没有明确说明。

您没有 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.

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