繁体   English   中英

如何通过javascript对象列表中的键值删除重复项?

[英]How to remove duplicates by key-value in javascript object list?

考虑以下数组:

[
  { url: "https://url.com/file1", md5: "fbbbabcc19264ce7b376ce4c726b9b85" },
  { url: "https://url.com/file2", md5: "d920d140432b961f07695ec34bd2a8ad" },
  { url: "https://url.com/file3", md5: "fbbbabcc19264ce7b376ce4c726b9b85" },
  { url: "https://url.com/file4", md5: "bf80655dbe90123324f88a778efa39f7" },
  { url: "https://url.com/file5", md5: "fbbbabcc19264ce7b376ce4c726b9b85" }
];

文件“file1”、“file3”和“file5”具有相同的内容,因此具有相同的md5。 我只想保留具有不同 md5s(file1、file2、file4)的文件。

使用现代 ES6 实现这一目标的可能方法是什么?

 const arr = [ {url: 'https://url.com/file1', md5: 'fbbbabcc19264ce7b376ce4c726b9b85'}, {url: 'https://url.com/file2', md5: 'd920d140432b961f07695ec34bd2a8ad'}, {url: 'https://url.com/file3', md5: 'fbbbabcc19264ce7b376ce4c726b9b85'}, {url: 'https://url.com/file4', md5: 'bf80655dbe90123324f88a778efa39f7'}, {url: 'https://url.com/file5', md5: 'fbbbabcc19264ce7b376ce4c726b9b85'} ]; const removeDuplicates = (myArr, prop) => { return myArr.filter((obj, pos, arr) => { return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos; }); } const result = removeDuplicates(arr, 'md5'); console.log(result)

您可以通过某个键过滤您的数组,在您的情况下为“md5”。

您可以使用Set来跟踪已找到的文件。

 const arr = [{ url: 'https://url.com/file1', md5: 'fbbbabcc19264ce7b376ce4c726b9b85' }, { url: 'https://url.com/file2', md5: 'd920d140432b961f07695ec34bd2a8ad' }, { url: 'https://url.com/file3', md5: 'fbbbabcc19264ce7b376ce4c726b9b85' }, { url: 'https://url.com/file4', md5: 'bf80655dbe90123324f88a778efa39f7' }, { url: 'https://url.com/file5', md5: 'fbbbabcc19264ce7b376ce4c726b9b85' } ] const uniqueFiles = new Set(); const ans = arr.filter(ele => { if (!uniqueFiles.has(ele.md5)) { uniqueFiles.add(ele.md5); return true; } return false; }); console.log(ans)

可以使用reduce来解决问题:

 const list = [ { url: 'https://url.com/file1', md5: 'fbbbabcc19264ce7b376ce4c726b9b85' }, { url: 'https://url.com/file2', md5: 'd920d140432b961f07695ec34bd2a8ad' }, { url: 'https://url.com/file3', md5: 'fbbbabcc19264ce7b376ce4c726b9b85' }, { url: 'https://url.com/file4', md5: 'bf80655dbe90123324f88a778efa39f7' }, { url: 'https://url.com/file5', md5: 'fbbbabcc19264ce7b376ce4c726b9b85' }, ]; const removeDup = (arr, key) => { return arr.reduce((acc, cur) => { if (acc.some(a => a[key] === cur[key])) return acc; return acc.concat(cur) }, []) }; console.log(removeDup(list, 'md5'))

只需使用由 md5 哈希键控的映射:

 const md5_map = files => files.reduce((map, {url, md5}) => ({...map, [md5]: url}), {}); console.log(md5_map(files));
 <script> const files = [ { url: "https://url.com/file1", md5: "fbbbabcc19264ce7b376ce4c726b9b85" }, { url: "https://url.com/file2", md5: "d920d140432b961f07695ec34bd2a8ad" }, { url: "https://url.com/file3", md5: "fbbbabcc19264ce7b376ce4c726b9b85" }, { url: "https://url.com/file4", md5: "bf80655dbe90123324f88a778efa39f7" }, { url: "https://url.com/file5", md5: "fbbbabcc19264ce7b376ce4c726b9b85" } ] </script>

 const list = [ { url: 'https://url.com/file1', md5: 'fbbbabcc19264ce7b376ce4c726b9b85' }, { url: 'https://url.com/file2', md5: 'd920d140432b961f07695ec34bd2a8ad' }, { url: 'https://url.com/file3', md5: 'fbbbabcc19264ce7b376ce4c726b9b85' }, { url: 'https://url.com/file4', md5: 'bf80655dbe90123324f88a778efa39f7' }, { url: 'https://url.com/file5', md5: 'fbbbabcc19264ce7b376ce4c726b9b85' }, ]; const deDupe = (arr = []) => { return Object.values(arr.reduce((obj, item) => { obj[item.md5] = obj[item.md5] || item; return obj; }, {})); } const dedupedList = deDupe(list); console.log(dedupedList); /* [ { "url": "https://url.com/file1", "md5": "fbbbabcc19264ce7b376ce4c726b9b85" }, { "url": "https://url.com/file2", "md5": "d920d140432b961f07695ec34bd2a8ad" }, { "url": "https://url.com/file4", "md5": "bf80655dbe90123324f88a778efa39f7" } ] */

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM