删除数组中的重复项

时间:2017-12-19 23:58:13

标签: javascript arrays testing duplicates

我正在尝试传递一个从数组中删除重复项的函数。它应该处理字符串,对象,整数。到目前为止,在我的代码中,我表明它将处理字符串,但没有别的。 Imake如何通用这个函数来处理数字,处理数组,处理对象和混合类型?

let unique = (a) => a.filter((el, i ,self) => self.indexOf(el) ===i);

在这个函数中,我有一个unique()过滤来创建一个新数组,它检查数组中的元素和索引以检查是否重复。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我认为你应该做的第一件事是对数组进行排序(输入到函数)。对它进行排序可以正确排序所有数组元素。例如,如果你有一个数组[ 1, 3, 4, 'a', 'c', 'a'],那么排序将导致[ 1 , 3 , 4, 'a', 'a' , 'c' ],接下来就是过滤返回的数组。

const unique = a => {
    if ( ! Array.isArray(a) )
        throw new Error(`${a} is not an array`);
    let val = a.sort().filter( (value, idx, array) => 
                 array[++idx] != value
             )
    return val;
}

let array = [ 1 , 5, 3, 2, "d", "q", "b" , "d" ];

unique(array); // [1, 2, 3, 5, "b", "d", "q"]

let obj = { foo: "bar" };

let arraySize = array.length;
array[arraySize] = obj;
array[arraySize++] = "foo";
array[arraySize++] = "baz";
array[arraySize++] = obj;

unique(array); // [1, 2, 3, 5, {…}, "b", "baz", "d", "foo", "hi", "q"]

它也适用于所有类型,但是如果传入一个数组文字,数组或对象作为其元素之一,则此代码将失败

 unique( [ "a", 1 , 3 , "a", 3 , 3, { foo: "baz" }, { foo: "baz" } ] ); // it will not remove the duplicate of { foo: "baz" } , because they both have a different memory address

并且您还应该注意,此代码不会按照传入的顺序返回数组,这是sort数组方法的结果

答案 1 :(得分:0)

尝试使用没有泛型的集合。你可以写一个函数

Set returnUnique(Object array[]) {
Set set=new HashSet();
  for (Object obj:array) {
     set.add(obj);
}
return set;
}