簡體   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