简体   繁体   English

如何根据日期过滤数据?

[英]How to filter data based on date?

I am having an array , 我有一个数组,

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

which gives the above result in console.. 这会在控制台中产生以上结果。

Here inside the foreach, i need to return the jobCategoryWithFromDate that has the latest date. 在foreach中,我需要返回具有最新日期的jobCategoryWithFromDate

So expected result is, (same like below).. 因此,预期结果是(与下面相同)。

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

The above is the expected result and no change in it, just need to filter the result and return jobCategoryWithFromDate returns unique value with latest date.. 上面是预期结果,没有任何变化,只需要过滤结果并返回jobCategoryWithFromDate返回具有最新日期的唯一值。

Despite of the duplicate names, the filter needs to be handled based on the date (latest).. 尽管名称重复,但仍需要根据日期(最新)来处理过滤器。

Edit: 编辑:

I have already accepted answer but later only i came to know that it is not working in all scenario, I am sorry for not testing it completely.. 我已经接受了答案,但是后来我才知道它不能在所有情况下正常工作,很抱歉没有完全测试它。

Don't know whether my explanation gone wrong, but thing is if the user name is same then filter needs to be done based on date or otherwise unique user with any date needs to be displayed. 不知道我的解释是否出错,但是如果用户名相同,则需要根据日期进行过滤,否则需要显示具有任何日期的唯一用户。

Eg: 例如:

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

Here in this snippet look at the last three values, which have different username but same date with previous records.. 在此代码段中,查看最后三个值,这些值具有不同的用户名,但与以前的记录具有相同的日期。

Here expected result is i need to get all the last three records along with above three, because they are different user, like 在这里,预期结果是我需要获取最后三个记录以及上面三个记录,因为它们是不同的用户,例如

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]

Assuming that the date is in format YYYY-MM-DD you can just extract part of the string containing date from each element and create date object from it 假设日期格式YYYY-MM-DD ,则可以从每个元素中提取包含日期的字符串的一部分,并从中创建日期对象

EDIT: it seems that what you wanted was to get the last date for every user instead of just getting an array of entries with the latest dates, edited snippet to match it (you can edit part of regex extracting the name if you want a different comparison distinguishing between users) 编辑:似乎您想要的是获取每个用户的最后日期,而不是仅获取具有最新日期的条目数组,并对其进行了编辑以使其匹配(您可以编辑正则表达式的一部分以提取名称,如果您希望使用其他名称,区分用户)

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

I would find the latest date first and then filter the array for objects with this date. 我将首先找到最新日期,然后使用该日期过滤对象数组。 This will return only the objects with the highest 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]" } ]; /* 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); 

you can apply regex to extract the date from string jobCategoryWithFromDate . 您可以应用正则表达式从字符串jobCategoryWithFromDate提取日期。 then sort by date, you will get latest results on top. 然后按日期排序,您将获得最新结果。

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)

You can do it using a simple reduce, You could improve the reduce by storing the array and also the currentMaxDateTS instead of recalculate the timestamp in every iteration. 您可以使用简单的reduce来实现。您可以通过存储数组以及currentMaxDateTS来改进reduce,而不必在每次迭代中重新计算时间戳。

Don't hesitate if you need more explanation around this code snippet 如果您需要有关此代码段的更多解释,请不要犹豫

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

You could just use a simple sort by extracting the date with regex, then use a recursive function to check if there are multiple dates the same: 您可以通过使用正则表达式提取日期来进行简单排序,然后使用递归函数检查是否有多个相同的日期:

 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