繁体   English   中英

如何根据日期过滤数据?

[英]How to filter data based on date?

我有一个数组,

 var data = [ { id: 1, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2017-05-01]" }, { id: 2, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2018-01-01]" }, { id: 3, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2019-01-01]" }, { id: 4, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2017-05-01]" }, { id: 5, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2018-01-01]" }, { id: 6, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2019-01-01]" }, { id: 7, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2018-01-01]" }, { id: 8, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2019-01-01]" }, { id: 9, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2017-05-01]" } ]; data.forEach(function(result) { console.log(result.jobCategoryWithFromDate); }); 

这会在控制台中产生以上结果。

在foreach中,我需要返回具有最新日期的jobCategoryWithFromDate

因此,预期结果是(与下面相同)。

ASSIST.. / Assistance [valid from 2019-01-01]
PROF.. / Professional [valid from 2019-01-01]
SEN.. / Senior [valid from 2019-01-01]

上面是预期结果,没有任何变化,只需要过滤结果并返回jobCategoryWithFromDate返回具有最新日期的唯一值。

尽管名称重复,但仍需要根据日期(最新)来处理过滤器。

编辑:

我已经接受了答案,但是后来我才知道它不能在所有情况下正常工作,很抱歉没有完全测试它。

不知道我的解释是否出错,但是如果用户名相同,则需要根据日期进行过滤,否则需要显示具有任何日期的唯一用户。

例如:

  var data = [ { id: 1, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2017-05-01]" }, { id: 2, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2018-01-01]" }, { id: 3, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2019-01-01]" }, { id: 4, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2017-05-01]" }, { id: 5, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2018-01-01]" }, { id: 6, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2019-01-01]" }, { id: 7, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2018-01-01]" }, { id: 8, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2019-01-01]" }, { id: 9, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2017-05-01]" }, { id: 10, jobCategoryWithFromDate: "Jun.. / Junior [valid from 2018-01-01]" }, { id: 11, jobCategoryWithFromDate: "Usr.. / User [valid from 2019-01-01]" }, { id: 12, jobCategoryWithFromDate: "Man.. / Manager [valid from 2017-05-01]" } ]; function extractDate(string){ return string.match(/[0-9]+-[0-9]+-[0-9]+/g); } var result = data.reduce((newestDates, currentItem)=>{ if (newestDates.length===0) newestDates.push(currentItem); else { const dateDifference = new Date(extractDate(newestDates[0].jobCategoryWithFromDate)) - new Date(extractDate(currentItem.jobCategoryWithFromDate)); if (dateDifference===0) newestDates.push(currentItem); // push items with the same date as newest found else if (dateDifference <= 0) newestDates = [currentItem]; // if item has newer date the original array gets replaced with one containing just this item // ignore case dateDifference >= 0 because we do not need to do anything with dates older than the newest found } return newestDates; },[]); console.log(result); 

在此代码段中,查看最后三个值,这些值具有不同的用户名,但与以前的记录具有相同的日期。

在这里,预期结果是我需要获取最后三个记录以及上面三个记录,因为它们是不同的用户,例如

ASSIST.. / Assistance [valid from 2019-01-01]
PROF.. / Professional [valid from 2019-01-01]
SEN.. / Senior [valid from 2019-01-01]
Jun.. / Junior  [valid from 2018-01-01]
Usr.. / User [valid from 2019-01-01]
Man.. / Manager [valid from 2017-05-01]

假设日期格式YYYY-MM-DD ,则可以从每个元素中提取包含日期的字符串的一部分,并从中创建日期对象

编辑:似乎您想要的是获取每个用户的最后日期,而不是仅获取具有最新日期的条目数组,并对其进行了编辑以使其匹配(您可以编辑正则表达式的一部分以提取名称,如果您希望使用其他名称,区分用户)

 var data = [ { id: 1, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2017-05-01]" }, { id: 2, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2018-01-01]" }, { id: 3, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2019-01-01]" }, { id: 4, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2017-05-01]" }, { id: 5, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2018-01-01]" }, { id: 6, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2019-01-01]" }, { id: 7, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2018-01-01]" }, { id: 8, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2019-01-01]" }, { id: 9, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2017-05-01]" }, { id: 10, jobCategoryWithFromDate: "Jun.. / Junior [valid from 2018-01-01]" }, { id: 11, jobCategoryWithFromDate: "Usr.. / User [valid from 2019-01-01]" }, { id: 12, jobCategoryWithFromDate: "Man.. / Manager [valid from 2017-05-01]" } ]; function extractNameNDate(string){ return [string.match(/^\\w+/), string.match(/[0-9]+-[0-9]+-[0-9]+/g)]; } var result = data.reduce((newestDates, currentItem)=>{ const [user, date] = extractNameNDate(currentItem.jobCategoryWithFromDate); if (newestDates[user]) { // compare dates for given user const [storedUser, storedDate] = extractNameNDate(newestDates[user].jobCategoryWithFromDate); const dateDifference = new Date(storedDate) - new Date(date); if (dateDifference <= 0) newestDates[user] = currentItem; } else { newestDates[user]=currentItem; } return newestDates; },{}); result = Object.values(result); console.log(result); 

我将首先找到最新日期,然后使用该日期过滤对象数组。 这将仅返回日期最高的对象:

 var data = [ { id: 1, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2017-05-01]" }, { id: 2, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2018-01-01]" }, { id: 3, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2019-01-01]" }, { id: 4, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2017-05-01]" }, { id: 5, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2018-01-01]" }, { id: 6, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2019-01-01]" }, { id: 7, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2018-01-01]" }, { id: 8, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2019-01-01]" }, { id: 9, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2017-05-01]" } ]; /* Add new property to data objects to store the "valid from" timestamp - Avoids parsing the text twice */ data.forEach(function(element, index, array) { var dateText = element.jobCategoryWithFromDate.match(/\\[valid from (\\d{4}-\\d{2}-\\d{2})\\]$/)[1]; array[index].fromDateTimestamp = +(new Date(dateText)); }); /* Get the highest value (the latest date) */ var max = data.reduce(function(currentMax, value) { return Math.max(currentMax, value.fromDateTimestamp); }, 0); /* Filter the data array to only include objects with the latest date */ var newData = data.filter(function(value) { return value.fromDateTimestamp === max; }); console.log(newData); 

您可以应用正则表达式从字符串jobCategoryWithFromDate提取日期。 然后按日期排序,您将获得最新结果。

var data = [
    { id: 1, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2017-05-01]" },
    { id: 2, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2018-01-01]" },
    { id: 3, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2019-01-01]" },
    { id: 4, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2017-05-01]" },
    { id: 5, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2018-01-01]" },
    { id: 6, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2019-01-01]" },
    { id: 7, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2018-01-01]" },
    { id: 8, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2019-01-01]" },
    { id: 9, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2017-05-01]" }
    ];

var result= data.map(d => ({...d, date: d.jobCategoryWithFromDate.match(/(\d{1,4}([.\-/])\d{1,2}([.\-/])\d{1,4})/g)[0]}))..sort((a, b)=> new Date(b.date) - new Date(a.date))

console.log(result)

您可以使用简单的reduce来实现。您可以通过存储数组以及currentMaxDateTS来改进reduce,而不必在每次迭代中重新计算时间戳。

如果您需要有关此代码段的更多解释,请不要犹豫

 const data = [ { id: 1, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2017-05-01]" }, { id: 2, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2018-01-01]" }, { id: 3, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2019-01-01]" }, { id: 4, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2017-05-01]" }, { id: 5, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2018-01-01]" }, { id: 6, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2019-01-01]" }, { id: 7, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2018-01-01]" }, { id: 8, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2019-01-01]" }, { id: 9, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2017-05-01]" } ]; // Function returning the date string inside [valid from 2017-05-01] const getDateFromJobCategory = (jobCategoryWithFromDate) => jobCategoryWithFromDate.match(/[0-9]+-[0-9]+-[0-9]+/g); const filteredData = data.reduce((acc, data) => { // Get data date in timestamp const dataDateString = getDateFromJobCategory(data.jobCategoryWithFromDate); const dataDateTS = new Date(dataDateString).getTime(); // Get current max date in timestamp const currentMaxDate = getDateFromJobCategory(acc[0]); const currentMaxDateTS = new Date(currentMaxDate).getTime() return dataDateTS > currentMaxDateTS ? [data.jobCategoryWithFromDate] : dataDateTS === currentMaxDateTS ? [...acc, data.jobCategoryWithFromDate] : acc }, ["[valid from 0001-01-01]"]); const finalResult = filteredData.forEach(jobCategoryWithFromDate => console.log(jobCategoryWithFromDate)) 

您可以通过使用正则表达式提取日期来进行简单排序,然后使用递归函数检查是否有多个相同的日期:

 var data = [ { id: 1, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2017-05-01]" }, { id: 2, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2018-01-01]" }, { id: 3, jobCategoryWithFromDate: "ASSIST.. / Assistance [valid from 2019-01-01]" }, { id: 4, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2017-05-01]" }, { id: 5, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2018-01-01]" }, { id: 6, jobCategoryWithFromDate: "PROF.. / Professional [valid from 2019-01-01]" }, { id: 7, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2018-01-01]" }, { id: 8, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2019-01-01]" }, { id: 9, jobCategoryWithFromDate: "SEN.. / Senior [valid from 2017-05-01]" } ]; const getDate = date => +date.match(/[0-9]{4}-[0-9]{2}-[0-9]{2}/g)[0].split('-').join('') data = data.sort(({jobCategoryWithFromDate:date1}, {jobCategoryWithFromDate:date2}) => getDate(date2) - getDate(date1)) const getRecent = (data, i=0) => getDate(data[i].jobCategoryWithFromDate) === getDate(data[i + 1].jobCategoryWithFromDate) ? [data[i], ...getRecent(data, i+1)] : [data[i]] getRecent(data).forEach(obj => console.log(obj)) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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