如何在排除重复值的同时使用map函数创建数组?
在我的应用中,我们创建了一个像这样的数组
var commTypes;
commTypes = ourObject.map(function(obj, index) {
return obj.section;
});
它创建一个obj.sections数组。我们对象中的许多对象都有相同的部分,我希望数组没有重复。 我可以在地图功能中执行此操作吗?
我已经尝试了几种在map函数中引用commTypes
的方法,但没有一种方法有效。
答案 0 :(得分:2)
.map()
函数旨在返回与原始列表长度相同的列表。尝试做任何其他事都很痛苦。
幸好有更普遍的.reduce()
:
commTypes = ourObject.reduce(function(rv, obj) {
if (!rv.sections(obj.section)) {
rv.list.push(obj); // or just obj.section if that's all you want
rv.sections[obj.section] = 1;
}
return rv;
}, { list: [], sections: {} }).list;
只记得对象中的节名。 (如果你的节id不是一个字符串,事情就会变得更复杂;你可能想要使用ES6 Set而不是一个简单的对象。)
答案 1 :(得分:2)
您无法使用地图功能执行此操作。 map函数只是将一个项目转换为另一个项目(例如,只获取您需要的属性)。如果要在排除重复值的同时创建数组,则应使用哈希表(以获得最佳性能)和循环/过滤功能。
使用过滤功能:
var hash = {};
var commTypes = ourObject.map(function(obj) {
return obj.section;
}).filter(function(section){
if(!hash[section]){
hash[section] = true;
return true;
}
return false;
});
使用for循环(单个循环遍历初始数组):
var hash = {};
var commTypes = [];
for(var i = 0; i < ourObject.length; i++){
var section = ourObject[i].section;
if(!hash[section]){
commTypes.push(section);
hash[section] = true;
}
}
答案 2 :(得分:0)
您可以使用其中任何一个
[...new Set(array)];
array.filter((item, index) => array.indexOf(item) === index);
array.reduce(
(unique, item) => (unique.includes(item) ? unique : [...unique, item]),
[],
);
我最喜欢的是使用Set,因为它最短,最简单