簡體   English   中英

過濾對象數組,同時根據密鑰對刪除重復項

[英]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 個元素的略微精簡的版本。 我的標准如下:

  • 丟棄 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循環。

對於如何最好地解決這個問題,我將不勝感激。 現在就像我說的......我很難過。

謝謝你們!

這是執行過濾的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM