【发布时间】:2022-01-06 16:36:15
【问题描述】:
我正在编写一个小编码项目以供自己享受,但我被各种问题难住了。我现在有工作代码,但我知道它可以被清理。本质上,我试图获取一个对象数组,并且只返回满足特定条件的唯一元素。
使用此示例数据:
[{
"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 个元素的精简版本。我的标准如下:
- 丢弃 frameHeight 高于用户指定值的元素(在本例中,我们假设该值为 720)
- 仅返回最终集中的唯一(基于标题)元素
- 保留最高分辨率的项目(基于 frameHeight)
- 如果可能,首选无字幕媒体(即,如果字幕和无字幕元素都以允许的最高分辨率存在,则仅保留无字幕元素)
此外,我希望返回数组的对象仅包含 4 个键:“title”、“url”(将从 file.url 映射)、“filesize”和“duration”
到目前为止,我已经尝试了各种方法,包括:
- 根据每个元素的frameHeight对数组进行降序排序,然后
- 如果数组中不存在标题,则循环排序数组并将值推送到新数组中,然后
- 过滤掉每个元素的字幕版本,但前提是该项目的分辨率存在非字幕版本。
如你所知,到目前为止,我所拥有的东西很乱而且非常……不雅。
这里是:
// 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 循环。
对于如何最好地解决此问题的任何见解,我将不胜感激。现在就像我说的......我很难过。
谢谢大家!
【问题讨论】:
-
我只会根据您的标准进行过滤或过滤。在此过程中运行检查以确定标题是否存在以及是否存在比较框架高度等很容易。我认为您需要首先展示您的尝试以找到您正在寻找的改进
-
我已经添加了我目前所拥有的,但就像我说的那样......它真的很丑。
标签: javascript arrays object