[英]Filter array of objects while removing duplicates based on key pair
我正在為自己的樂趣編寫一個小編碼項目,但我被各種各樣的問題難住了。 我現在有工作代碼,但我知道它可以被清理。 本質上,我正在嘗試獲取一組對象,並且只返回滿足特定條件的唯一元素。
使用此示例數據:
[{
"title": "1. Title of first song",
"file": {
"url": "https://mediafiles.abc/files/media_E_001_r720P.mp4",
"modifiedDatetime": "2019-02-06 03:40:52"
},
"filesize": 44043684,
"trackImage": {
"url": "https://mediafiles.abc/files/media_E_001.jpg",
"modifiedDatetime": "2021-03-15T12:34:06+00:00"
},
"mimetype": "video/mp4",
"subtitled": false,
"frameWidth": 1280,
"frameHeight": 720,
"duration": 233.29973333333334
},
{
"title": "1. Title of first song",
"file": {
"url": "https://mediafiles.abc/files/media_E_001_r240P.mp4",
"modifiedDatetime": "2019-02-06 03:40:52"
},
"filesize": 653534,
"trackImage": {
"url": "https://mediafiles.abc/files/media_E_001.jpg",
"modifiedDatetime": "2021-03-15T12:34:06+00:00"
},
"mimetype": "video/mp4",
"subtitled": false,
"frameWidth": 320,
"frameHeight": 240,
"duration": 233.29973333333334
},
{
"title": "2. Title of second song",
"file": {
"url": "https://mediafiles.abc/files/media_E_002_r240P.mp4",
"modifiedDatetime": "2019-02-06 03:40:52"
},
"filesize": 45456456,
"trackImage": {
"url": "https://mediafiles.abc/files/media_E_002.jpg",
"modifiedDatetime": "2021-03-15T12:34:06+00:00"
},
"mimetype": "video/mp4",
"subtitled": false,
"frameWidth": 320,
"frameHeight": 240,
"duration": 233.29973333333334
},
{
"title": "2. Title of second song",
"file": {
"url": "https://mediafiles.abc/files/media_E_002_r720P.mp4",
"modifiedDatetime": "2019-02-06 03:40:52"
},
"filesize": 3453453,
"trackImage": {
"url": "https://mediafiles.abc/files/media_E_002.jpg",
"modifiedDatetime": "2021-03-15T12:34:06+00:00"
},
"mimetype": "video/mp4",
"subtitled": true,
"frameWidth": 1280,
"frameHeight": 720,
"duration": 233.29973333333334
},
{
"title": "3. Title of third song",
"file": {
"url": "https://mediafiles.abc/files/media_E_003_r240P.mp4",
"modifiedDatetime": "2019-02-06 03:40:52"
},
"filesize": 45456456,
"trackImage": {
"url": "https://mediafiles.abc/files/media_E_003.jpg",
"modifiedDatetime": "2021-03-15T12:34:06+00:00"
},
"mimetype": "video/mp4",
"subtitled": false,
"frameWidth": 320,
"frameHeight": 240,
"duration": 233.29973333333334
},
{
"title": "3. Title of third song",
"file": {
"url": "https://mediafiles.abc/files/media_E_003_r720P.mp4",
"modifiedDatetime": "2019-02-06 03:40:52"
},
"filesize": 3453453,
"trackImage": {
"url": "https://mediafiles.abc/files/media_E_003.jpg",
"modifiedDatetime": "2021-03-15T12:34:06+00:00"
},
"mimetype": "video/mp4",
"subtitled": true,
"frameWidth": 1280,
"frameHeight": 720,
"duration": 233.29973333333334
},
{
"title": "3. Title of third song",
"file": {
"url": "https://mediafiles.abc/files/media_E_003_r720P.mp4",
"modifiedDatetime": "2019-02-06 03:40:52"
},
"filesize": 3453453,
"trackImage": {
"url": "https://mediafiles.abc/files/media_E_003.jpg",
"modifiedDatetime": "2021-03-15T12:34:06+00:00"
},
"mimetype": "video/mp4",
"subtitled": false,
"frameWidth": 1280,
"frameHeight": 720,
"duration": 233.29973333333334
},
{
"title": "3. Title of third song",
"file": {
"url": "https://mediafiles.abc/files/media_E_003_r1080P.mp4",
"modifiedDatetime": "2019-02-06 03:40:52"
},
"filesize": 15611561561,
"trackImage": {
"url": "https://mediafiles.abc/files/media_E_003.jpg",
"modifiedDatetime": "2021-03-15T12:34:06+00:00"
},
"mimetype": "video/mp4",
"subtitled": false,
"frameWidth": 1920,
"frameHeight": 1080,
"duration": 233.29973333333334
}
]
我想對其進行過濾並返回第 1、第 4 和第 7 個元素的略微精簡的版本。 我的標准如下:
此外,我希望返回數組的對象僅包含 4 個鍵:“title”、“url”(將從 file.url 映射)、“filesize”和“duration”
到目前為止,我已經嘗試了各種方法,包括:
如您所知,到目前為止,我所擁有的東西很混亂而且非常...不雅。
這里是:
// data is my data, reverse sorted by frameHeight
function getMediaInfo(data) {
let mediaFiles = [];
for (var mediaFileItem of data) {
if ((mediaFileItem.frameHeight !== 0 && mediaFileItem.frameHeight > prefs.maxRes) || mediaFiles.filter(mediaFile => {
return mediaFile.title == mediaFileItem.title && mediaFile.subtitled == mediaFileItem.subtitled
}).length > 0) {
continue;
} else {
mediaFiles.push({
title: mediaFileItem.title,
filesize: mediaFileItem.filesize,
url: mediaFileItem.file.url,
subtitled: mediaFileItem.subtitled,
duration: mediaFileItem.duration
});
}
}
if (mediaFiles.length > 1) mediaFiles = mediaFiles.filter(mediaFile => !mediaFile.subtitled);
return mediaFiles.reverse();
}
我想使用filter
、 map
和reduce
的某種組合,但坦率地說,我不知道從哪里開始。
我不確定一個reduce
是否可以管理所有這些,或者我是否需要將一些東西鏈接在一起。 無論如何,我正在尋找一些干凈優雅的東西,而不是像我現在擁有的一堆for
循環。
對於如何最好地解決這個問題,我將不勝感激。 現在就像我說的......我很難過。
謝謝你們!
這是執行過濾的 function ,分組(使用Map
),保留每個組的最佳得分 object ,並減少到幾個屬性:
function convert(data, maxFrameHeight=720) { data = data.filter(({frameHeight}) => frameHeight <= maxFrameHeight); let map = new Map(data.map(item => [item.title, item])); for (let item of data) { let {frameHeight, subtitled} = map.get(item.title); if ((item.frameHeight - frameHeight || subtitled - item.subtitled) > 0) { map.set(item.title, item); } } return Array.from(map.values(), ({title, file: {url}, filesize, duration}) => ({title, url, filesize, duration}) ); } let data = [{"title": "1. Title of first song","file": {"url": "https://mediafiles.abc/files/media_E_001_r720P.mp4","modifiedDatetime": "2019-02-06 03:40:52"},"filesize": 44043684,"trackImage": {"url": "https://mediafiles.abc/files/media_E_001.jpg","modifiedDatetime": "2021-03-15T12:34:06+00:00"},"mimetype": "video/mp4","subtitled": false,"frameWidth": 1280,"frameHeight": 720,"duration": 233.29973333333334},{"title": "1. Title of first song","file": {"url": "https://mediafiles.abc/files/media_E_001_r240P.mp4","modifiedDatetime": "2019-02-06 03:40:52"},"filesize": 653534,"trackImage": {"url": "https://mediafiles.abc/files/media_E_001.jpg","modifiedDatetime": "2021-03-15T12:34:06+00:00"},"mimetype": "video/mp4","subtitled": false,"frameWidth": 320,"frameHeight": 240,"duration": 233.29973333333334},{"title": "2. Title of second song","file": {"url": "https://mediafiles.abc/files/media_E_002_r240P.mp4","modifiedDatetime": "2019-02-06 03:40:52"},"filesize": 45456456,"trackImage": {"url": "https://mediafiles.abc/files/media_E_002.jpg","modifiedDatetime": "2021-03-15T12:34:06+00:00"},"mimetype": "video/mp4","subtitled": false,"frameWidth": 320,"frameHeight": 240,"duration": 233.29973333333334},{"title": "2. Title of second song","file": {"url": "https://mediafiles.abc/files/media_E_002_r720P.mp4","modifiedDatetime": "2019-02-06 03:40:52"},"filesize": 3453453,"trackImage": {"url": "https://mediafiles.abc/files/media_E_002.jpg","modifiedDatetime": "2021-03-15T12:34:06+00:00"},"mimetype": "video/mp4","subtitled": true,"frameWidth": 1280,"frameHeight": 720,"duration": 233.29973333333334},{"title": "3. Title of third song","file": {"url": "https://mediafiles.abc/files/media_E_003_r240P.mp4","modifiedDatetime": "2019-02-06 03:40:52"},"filesize": 45456456,"trackImage": {"url": "https://mediafiles.abc/files/media_E_003.jpg","modifiedDatetime": "2021-03-15T12:34:06+00:00"},"mimetype": "video/mp4","subtitled": false,"frameWidth": 320,"frameHeight": 240,"duration": 233.29973333333334},{"title": "3. Title of third song","file": {"url": "https://mediafiles.abc/files/media_E_003_r720P.mp4","modifiedDatetime": "2019-02-06 03:40:52"},"filesize": 3453453,"trackImage": {"url": "https://mediafiles.abc/files/media_E_003.jpg","modifiedDatetime": "2021-03-15T12:34:06+00:00"},"mimetype": "video/mp4","subtitled": true,"frameWidth": 1280,"frameHeight": 720,"duration": 233.29973333333334},{"title": "3. Title of third song","file": {"url": "https://mediafiles.abc/files/media_E_003_r720P.mp4","modifiedDatetime": "2019-02-06 03:40:52"},"filesize": 3453453,"trackImage": {"url": "https://mediafiles.abc/files/media_E_003.jpg","modifiedDatetime": "2021-03-15T12:34:06+00:00"},"mimetype": "video/mp4","subtitled": false,"frameWidth": 1280,"frameHeight": 720,"duration": 233.29973333333334},{"title": "3. Title of third song","file": {"url": "https://mediafiles.abc/files/media_E_003_r1080P.mp4","modifiedDatetime": "2019-02-06 03:40:52"},"filesize": 15611561561,"trackImage": {"url": "https://mediafiles.abc/files/media_E_003.jpg","modifiedDatetime": "2021-03-15T12:34:06+00:00"},"mimetype": "video/mp4","subtitled": false,"frameWidth": 1920,"frameHeight": 1080,"duration": 233.29973333333334}]; let result = convert(data); console.log(result);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.