【问题标题】:Filter array of objects while removing duplicates based on key pair过滤对象数组,同时根据密钥对删除重复项
【发布时间】: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();
} 

我想使用filtermapreduce 的某种组合,但坦率地说,我不知道从哪里开始。

我不确定 reduce 是否可以管理所有这些,或者我是否需要将一些东西链接在一起。无论如何,我正在寻找干净优雅的东西,而不是像我现在拥有的一堆 for 循环。

对于如何最好地解决此问题的任何见解,我将不胜感激。现在就像我说的......我很难过。

谢谢大家!

【问题讨论】:

  • 我只会根据您的标准进行过滤或过滤。在此过程中运行检查以确定标题是否存在以及是否存在比较框架高度等很容易。我认为您需要首先展示您的尝试以找到您正在寻找的改进
  • 我已经添加了我目前所拥有的,但就像我说的那样......它真的很丑。

标签: javascript arrays object


【解决方案1】:

这是一个执行过滤、分组(使用Map)、保留每组最佳得分对象以及减少几个属性的函数:

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);

【讨论】:

  • 天哪,太快了!非常感谢。我没想到实际的代码会起作用,只是朝着正确的方向迈出了一步。谢谢您的回答;我现在要在地图上阅读,因为我过去没有使用过它们
猜你喜欢
  • 1970-01-01
  • 2016-05-15
  • 2012-05-17
  • 1970-01-01
  • 2018-05-25
  • 2020-11-21
  • 2018-07-29
  • 1970-01-01
  • 2020-06-29
相关资源
最近更新 更多