如何基于CategoryDesc与SubCatDesc两个属性获取数组去重值?
JavaScript数组按多属性组合去重实现方案
针对你需要按CategoryDesc和SubCatDesc两个属性组合去重的需求,这里提供几种简洁实用的实现方式:
方法1:Set结合JSON.stringify序列化
这种方式利用Set自动去重的特性,先将每个对象序列化为字符串,去重后再转回对象:
const array = [ { "CategoryDesc":"SEC Violations (Insider Trading, Securities Fraud)", "SubCatDesc":"BBC"}, { "CategoryDesc":"SEC Violations (Insider Trading, Securities Fraud)", "SubCatDesc":"BBC"}, { "CategoryDesc": "FRD" ,"SubCatDesc":"VRD"}, { "CategoryDesc": "FRD" ,"SubCatDesc":"VRD"}, { "CategoryDesc":"SEC Violations (Insider Trading, Securities Fraud)", "SubCatDesc":"BBC"}, { "CategoryDesc":"FRD", "SubCatDesc":"BBC"} ]; const uniqueArray = Array.from(new Set(array.map(item => JSON.stringify(item)))).map(str => JSON.parse(str)); console.log(uniqueArray);
说明:如果数组中对象的属性顺序完全一致,这个方法可以直接用;如果属性顺序可能不同,建议用下面的方法。
方法2:reduce+对象映射(推荐)
通过自定义唯一键(两个属性拼接),用reduce遍历数组并存储唯一的对象,效率更高:
const array = [ { "CategoryDesc":"SEC Violations (Insider Trading, Securities Fraud)", "SubCatDesc":"BBC"}, { "CategoryDesc":"SEC Violations (Insider Trading, Securities Fraud)", "SubCatDesc":"BBC"}, { "CategoryDesc": "FRD" ,"SubCatDesc":"VRD"}, { "CategoryDesc": "FRD" ,"SubCatDesc":"VRD"}, { "CategoryDesc":"SEC Violations (Insider Trading, Securities Fraud)", "SubCatDesc":"BBC"}, { "CategoryDesc":"FRD", "SubCatDesc":"BBC"} ]; const uniqueMap = array.reduce((acc, current) => { // 用两个属性拼接成唯一标识键,选不会出现在属性值里的符号当分隔符 const key = `${current.CategoryDesc}|${current.SubCatDesc}`; // 键不存在时才存入对象 if (!acc[key]) acc[key] = current; return acc; }, {}); // 提取对象中的值组成去重后的数组 const uniqueArray = Object.values(uniqueMap); console.log(uniqueArray);
方法3:ES6 Map结构实现
和方法2逻辑类似,用Map存储唯一键值对,语义更清晰:
const array = [ { "CategoryDesc":"SEC Violations (Insider Trading, Securities Fraud)", "SubCatDesc":"BBC"}, { "CategoryDesc":"SEC Violations (Insider Trading, Securities Fraud)", "SubCatDesc":"BBC"}, { "CategoryDesc": "FRD" ,"SubCatDesc":"VRD"}, { "CategoryDesc": "FRD" ,"SubCatDesc":"VRD"}, { "CategoryDesc":"SEC Violations (Insider Trading, Securities Fraud)", "SubCatDesc":"BBC"}, { "CategoryDesc":"FRD", "SubCatDesc":"BBC"} ]; const uniqueMap = new Map(); array.forEach(item => { const key = `${item.CategoryDesc}|${item.SubCatDesc}`; if (!uniqueMap.has(key)) { uniqueMap.set(key, item); } }); const uniqueArray = Array.from(uniqueMap.values()); console.log(uniqueArray);
以上三种方法都能得到你预期的去重结果,其中方法2和3在性能和兼容性上表现更优,推荐使用。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

