Javascript传递参数到过滤函数?

时间:2017-02-04 04:42:34

标签: javascript filter

我想从初始数组中删除与这些参数具有相同值的所有元素。

例如:

destroyer([1, 2, 3, 1, 2, 3], 2, 3) should return [1, 1].
destroyer([1, 2, 3, 5, 1, 2, 3], 2, 3) should return [1, 5, 1].

这是我的代码:

function takeaway(value) {

    return ??
}


function destroyer(arr) { 
  // Remove all the values\
  var args = Array.from(arguments);   // args = [[1,2,3,1,2,3],2,3]

  var arr1 = args.shift();            // arr1 = [1, 2, 3, 1, 2, 3]
                                      // args = [2,3]

  var filtered = arr1.filter(takeaway);


  return filtered;

}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);

如果我没有弄错,我需要将我想要取出的元素(args数组)传递给过滤函数,以便它知道要过滤掉什么......我怎么会这样做?此?

4 个答案:

答案 0 :(得分:4)

尝试数组的包含功能。如果arr1元素未包含在args数组中,则返回false,并且仅过滤掉返回true的元素。

function destroyer(arr) { 
  // Remove all the values\
  var args = Array.from(arguments);   // args = [[1,2,3,1,2,3],2,3]

  var arr1 = args.shift();            // arr1 = [1, 2, 3, 1, 2, 3]
                                      // args = [2,3]

  var filtered = arr1.filter(function(value){
    return !args.includes(value);
});


  return filtered;

}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);
destroyer([1, 2, 3, 5, 1, 2, 3], 2, 3)

答案 1 :(得分:3)

const destroyer = (arr, ...nopes) =>
  arr.filter(value => !nopes.includes(value))

destroyer([1, 2, 3, 1, 2, 3], 2, 3)

因为很难理解类型签名,所以我不愿意使用可变参数函数,而是支持像这样的显式数组。对于部分应用或currying,翻转参数顺序也会更好。

//: ( Array Int, Array Int ) -> Array Int
const destroyer = (nopes, arr) =>
  arr.filter(value => !nopes.includes(value))

destroyer([2, 3], [1, 2, 3, 1, 2, 3])

答案 2 :(得分:0)

使用Array#indexOf检查参数

中是否存在元素
shops__item

答案 3 :(得分:0)

这是我的解决方案,有点解释。它与其他细微差别相似。它更详细地显示了回调函数的作用。希望它能帮助每个人理解它!

let arr = [1, 2, 3, 3, 4, 5]

    function destroyer(myArray) {
        let argsArr = Array.from(arguments)             //argsArr = [[1,2,3,3,4,5],3,4]
        let sliced = argsArr.slice.call(arguments, 1)  //sliced = [3,4] 
                                                        //myArray = [1,2,3,3,4,5]
        function takeAway(val) {                       // val = each element in myArray:1,2,3,3,4,5
            return sliced.indexOf(val) === -1          //[3,4] indexOf 3,4 = true (+1) [3,4] indexOf 1,2,5
                                                        // == false (-1) so it is returned by the filter method
        }
        let answer = myArray.filter(takeAway)           // answer = [1,2,5]
        return answer
    }

    console.log(destroyer(arr, 3, 4))