从字典数组中获取按日期排序的最多两个最近项目



一直在寻找类似的线程,但就是无法理解它。即使对我来说,我目前的项目似乎也更加复杂。这是我的json(对不起,它有点长(:

items = [
{
'name' : 'Books',
'types':[
{
'name' : 'Hard Cover',
'genres':[
{
'genre' : 'Romance',
'added_date' : '2018-09-15',
'id':1
},
{
'genre' : 'Crime',
'added_date' : '2018-10-01',
'id' : 2
}
],
'cover':['pic1.png','pic2.png']
},
{
'name' : 'Audio',
'genres':[
{
'genre' : 'Memoir',
'added_date' : '2018-08-01',
'id' : 3
}
],
'pictures':['pic3.png','pic4.png']
},
]
},
{
'name' : 'Videos',
'types':[
{
'name' : 'English',
'genres':[
{
'genre' : 'Comedy',
'added_date' : '2018-10-14',
'id' : 12
}
],
'pictures':['pic5.png','pic6.png']
}
]
}
];

我现在想要的输出是根据流派块中的added_date字段获取最近添加的 3 个项目。现在对于这些项目,我需要返回一个带有完整路径的字典元素的数组:

[
{'id':7,'genre':'Romance','name':'Hard Cover','added_date':'2018-09-16','top_parent_name':'Books'},
{'id':8,'genre':'Memoir','name':'Audio','added_date':'2018-09-15','top_parent_name':'Books'},

]

基于added_date,获取在整个对象及其相关信息中添加的最新 3 个项目。我希望这是有道理的。

到目前为止,我已经想到了以下内容,但它很快就变得很麻烦。

items.forEach(function(value, index, array) {
const types: any[] = value['types'];
types.forEach(function(value_t, index_t, array_t){
const genres: any[] = value_model['genes'];
//loop again to get date....
});

});

这是一种方法。 首先通过执行多个级别的映射,然后执行多个级别的平展,将所需的数据提取到对象中。 (我相信Array.prototype.flatten还不够普遍,所以我使用reduce(concat)

然后,当您将数据提取到平面列表中时,按日期降序排序。 最后,获取前三个值:

const items = [{"name": "Books", "types": [{"cover": ["pic1.png", "pic2.png"], "genres": [{"added_date": "2018-09-15", "genre": "Romance", "id": 1}, {"added_date": "2018-10-01", "genre": "Crime", "id": 2}], "name": "Hard Cover"}, {"genres": [{"added_date": "2018-08-01", "genre": "Memoir", "id": 3}], "name": "Audio", "pictures": ["pic3.png", "pic4.png"]}]}, {"name": "Videos", "types": [{"genres": [{"added_date": "2018-10-14", "genre": "Comedy", "id": 12}], "name": "English", "pictures": ["pic5.png", "pic6.png"]}]}];
const tops = items.map(item => item.types.map(type => type.genres.map(genre => ({
name: type.name,
top_name: item.name,
...genre
})))).reduce(
(a, b) => a.concat(b), []
).reduce(
(a, b) => a.concat(b), []
).sort(
(a, b) => a.added_date > b.added_date ? -1 : a.added_date < b.added_date ? 1 : 0
).slice(0, 3)
console.log(tops)

在这些单独的循环中肯定存在一些低效率,并且排序可能是O(n * log(n))的,而即使是三部分最大值也应该O(n)。 但是,如果事实证明这些是您应用程序中的瓶颈,我只会担心这些。

因此,如果我正确理解了这个问题,您希望按日期添加最近的 3 个,并扁平化为特定格式。如果是这种情况,那么答案可能取决于您正在处理的数据量。一种选择是构建一个完全平面的数据数组,然后按日期排序。为此,我会使用数组扁平化实用程序函数(我已经包含一个,但如果可以的话,请使用 lodash(

例如:

const flatten = arr => arr.reduce((a, b) => a.concat(b), [])
const mapGenres = (topName, name, genres) => genres.map(genre => ({
name,
topName,
...genre
})
const result = flatten(items.map(({ name, types }) => 
flatten(types.map(type => mapGenres(name, type.name, type.genres)))
))
result.sort((a, b) => return b.added_date.localeCompare(a.added_date))

这是未经测试的,但应该相当直接。嵌套级别的拼合贴图,在叶子处产生所需的输出。

相关内容

最新更新