Javascript удалить объект из массива на основе большего ключа даты - PullRequest
0 голосов
/ 02 марта 2020

У меня есть такой массив -

"formats": [
{
    "format": "eBook",
    "published": "3/3/2014",
    "id": "1234"
},
{
    "format": "Paperback",
    "published": "19/3/2020",
    "id": "123"
},
{
    "format": "eBook",
    "published": "19/3/2020",
    "id": "12345"
}]

, и я хотел бы написать функцию фильтра js, которая должна возвращать меня на основе последнего формата. Так что-то вроде

"formats": [
{
    "format": "Paperback",
    "published": "19/3/2020",
    "id": "123"
},
{
    "format": "eBook",
    "published": "19/3/2020",
    "id": "12345"
}]

Где объект с идентификатором 1234 удаляется, потому что другой объект с таким же форматом (электронная книга) имеет большую дату публикации.

Я пытался использовать функцию фильтра JS, но почему-то я его испортил вверх.

Ответы [ 2 ]

1 голос
/ 02 марта 2020

const formats = [
{
    "format": "eBook",
    "published": "3/3/2014",
    "id": "1234"
},
{
    "format": "Paperback",
    "published": "27/3/2020",
    "id": "123"
},
{
    "format": "Paperback",
    "published": "19/3/2020",
    "id": "123"
},
{
    "format": "eBook",
    "published": "19/3/2020",
    "id": "12345"
}];

function filterFormats(formats){
    const toTime = (date) => new Date(date.replace(/(\d+)\/(\d+)\/(\d+)/, "$2/$1/$3")).getTime();
    const data = formats.reduce((a, b) => {
      if(b.format+'' in a && toTime(a[b.format].published) > toTime(b.published)) return a;
      a[b.format] = b;
      return a;
    }, {});
    return Object.values(data);
}

console.log(filterFormats(formats));
0 голосов
/ 02 марта 2020

Вот мое решение:

    const formats =  [
    {
        "format": "eBook",
        "published": "3/3/2014",
        "id": "1234"
    },
    {
        "format": "Paperback",
        "published": "19/3/2020",
        "id": "123"
    },
    {
        "format": "eBook",
        "published": "19/3/2020",
        "id": "12345"
    }]
    
    
    const getDateObj = (str) => new Date(str.split('/').map(i => i.length<2 ? `0${i}` : i).reverse().join('-'));
    
    const getFilteredArrayOfLatestEntriesForFormats = (formatsArr) => {
    	const formatToLatestEntriesMap = formatsArr.reduce((latestFormatEntryMap,obj) => {
    		const publishedAt = getDateObj(obj.published);
    		if(!latestFormatEntryMap[obj.format] || latestFormatEntryMap[obj.format].publishedAt<publishedAt){
    
    			latestFormatEntryMap[obj.format] = {
    				...obj,
    				publishedAt: publishedAt
    			};
    		}
    		return latestFormatEntryMap;
    	},{})
    
    	return Object.keys(formatToLatestEntriesMap).map(format => {
    		delete formatToLatestEntriesMap[format].publishedAt;
    		return formatToLatestEntriesMap[format];
    	})
    }
    
    console.log(getFilteredArrayOfLatestEntriesForFormats(formats));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...