需求

给出一个类数组,删除要求的重复数据,返回新数组

destroyer([1, 2, 3, 1, 2, 3], 2, 3) should return [1, 1]
destroyer([2, 3, 2, 3], 2, 3) should return []
destroyer(["tree", "hamburger", 53], "tree", 53) should return ["hamburger"]

思路1

1.类数组转化成数组
2.双重循环比较两个数组的元素
3.删除重复数据
4.剔除非Boolean数据

function destroyer(arr) {
    var args = Array.from(arguments).slice(1);
    for(var i=0; i<arr.length; i++) {
        for(var j=0; j<args.length; j++) {
            if(arr[i] === args[j]) {
                delete arr[i];
            }
        }
    }
    
    return arr.filter(Boolean);
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

思路2

1.类数组转化成数组
2.fiter()方法返回不重复数组

function destroyer(arr) {
    var args = Array.from(arguments).slice(1);
    return arr.filter((val) => !args.includes(val));
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);

相关

arguments(类数组转换成数组),以下方法都可以
let args = Array.prototype.slice.call(arguments); 
let args = [].slice.call(arguments);
let args = Array.from(arguments);
let args = [...arguments];    
arr.filter(callback[, thisArg]) 
  • filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。

参数:

  • callback
    用来测试数组的每个元素的函数。调用时使用参数 (element, index, array)。返回true表示保留该元素(通过测试),false则不保留。
  • thisArg
    可选。执行 callback 时的用于 this 的值。
  • 返回值
    一个新的通过测试的元素的集合的数组

描述:

  • filter 为数组中的每个元素调用一次 callback 函数,并利用所有使得 callback 返回 true 或 等价于 true 的值 的元素创建一个新数组。callback 只会在已经赋值的索引上被调用,对于那些已经被删除或者从未被赋值的索引不会被调用。那些没有通过 callback 测试的元素会被跳过,不会被包含在新数组中。

有其他好的方法或思路的道友,不妨在沙发区神交一番。


小石头
266 声望15 粉丝