如何使用map函数创建数组,同时排除重复值?

时间:2015-04-16 17:36:33

标签: javascript arrays

如何在排除重复值的同时使用map函数创建数组?

在我的应用中,我们创建了一个像这样的数组

var commTypes;

commTypes = ourObject.map(function(obj, index) {
  return obj.section;
});

它创建一个obj.sections数组。我们对象中的许多对象都有相同的部分,我希望数组没有重复。 我可以在地图功能中执行此操作吗? 我已经尝试了几种在map函数中引用commTypes的方法,但没有一种方法有效。

3 个答案:

答案 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;
});

Demo 1

使用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;
    }
}

Demo 2

答案 2 :(得分:0)

您可以使用其中任何一个

[...new Set(array)];

array.filter((item, index) => array.indexOf(item) === index);

array.reduce(
  (unique, item) => (unique.includes(item) ? unique : [...unique, item]),
  [],
);

我最喜欢的是使用Set,因为它最短,最简单