2017-02-04 3 views
1

Я хочу удалить все элементы из начального массива, которые имеют такое же значение, что и эти аргументы.Javascript передает аргументы функции фильтрации?

Ex:

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 массив) в фильтр так что он знает, что отфильтровать ... Как я буду сопровождать это?

ответ

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

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

Потому что это труднее понять тип подписи, я бы уклоняться от использования VARIADIC функции, хотя в пользу явных массивов, как это. Переворот порядка аргументов также будет лучше для частичного применения или каррирования.

//: (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]) 
3

Попробуйте включить функцию массива. Если элемент 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) 
0

Используйте Array#indexOf, чтобы проверить, если элемент существует в аргументах

const destroyer = (arr, ...args) => arr.filter(value => args.indexOf(value) === -1); 
destroyer([1, 2, 3, 1, 2, 3], 2, 3); 
destroyer([1, 2, 3, 5, 1, 2, 3], 2, 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))