[英]get most two recent items ordered by date from a dictionary array
一直在寻找类似的线索,但无法将我的头缠住它。 即使对我来说,我当前的项目似乎也更复杂。 这是我的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'},
]
基于add_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))
这未经测试 ,但应该相当简单。 拼合贴图的嵌套级别,在叶子上产生所需的输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.