2016-03-29 2 views
0

Я пытаюсь решить эту проблему. Ищите и уничтожайте. Я не могу понять, что не так. Любая помощь ?freecodecamp Challenges-Seek and Destroy

Поиск и уничтожение Вам будет предоставлен исходный массив (первый аргумент в функции эсминца), за которым следует один или несколько аргументов. Удалите все элементы из исходного массива, которые имеют такое же значение, что и эти аргументы.

Это исходный код ниже:

function destroyer(arr) { 
 
    // Remove all the values 
 
    return arr; 
 
} 
 

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

Это мой код ниже:

function destroyer(arr) { 
 
    var letsDestroyThis = []; 
 
    var i =1 ; while (i<arguments.length) { 
 
    letsDestroyThis.push(arguments[i]); 
 
    i++; 
 
    } 
 
    
 
    for(var j=0 ; j< arguments[0].length; j++) { 
 
    for (var k= 0; k< letsDestroyThis.length; k++) { 
 
     if(arguments[0][j] === letsDestroyThis[k]){ 
 
     arguments[0].splice(j, 1); 
 
     } 
 
    } 
 
    } 
 
    
 
    return arguments[0]; 
 
} 
 

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

Заранее спасибо!

ответ

4

Вы можете создать массив всех значений, которые должны быть удалены. Затем используйте Array.filter, чтобы отфильтровать эти значения.

Примечание: Array.splice изменит оригинальный массив.

function destroyer() { 
 
    var arr = arguments[0]; 
 
    var params = []; 
 

 
    // Create array of all elements to be removed 
 
    for (var k = 1; k < arguments.length; k++) 
 
    params.push(arguments[k]); 
 
    
 
    // return all not matching values 
 
    return arr.filter(function(item) { 
 
    return params.indexOf(item) < 0; 
 
    }); 
 
} 
 

 
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));

0

Мой ответ похож на предыдущий, но я не использовал indexOf. Вместо этого я проверил значения в цикле, но компилятор дает мне предупреждение не объявлять функцию в цикле.

function destroyer(arr) { 
// Remove all the values 
var temp = []; 
for (var i = 1; i < arguments.length; i++) { 
    temp.push(arguments[i]); 
    arr = arguments[0].filter(function(value) { 
     return (value !== temp[i - 1]) ; 
    }); 
} 
return arr; 
} 
destroyer([1, 2, 3, 1, 2, 3], 2, 3); 
0

Это работает для меня:

function destroyer(arr) { 
// Remove all the values 

var args = Array.from(arguments); 
var filter = []; 

for (i = 0; i < args[0].length; i++){ 
for(j = 1; j < args.length; j++){ 
    if (args[0][i] === args[j]){ 
    delete args[0][i]; 
    } 
} 
} 

return args[0].filter(function(x){ 
return Boolean(x); 
}); 
} 

console.log(
destroyer([1, 2, 3, 1, 2, 3], 2, 3) 
); 
0

// два пути решения найти и уничтожить вызов на FreeCodeCamp // Я пытался упростить этот код, пожалуйста, оставьте свои решения, упрощая код // как много есть его можно

function destroyer1 (arr){ 
    //get array from arguments 
    var args = Array.prototype.slice.call(arguments); 
    args.splice(0,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(function(value){ 
    return Boolean(value); 
}); 
} 

// ------------------------------- -------

function destroyer(arr) { 
    // Remove all the values 
    //Get values from arguments of the function to an array, index 0(arr[0] will be "arr", 
    //rest of indexes will be rest of arguments. 

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

console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3)); 
console.log(destroyer1([1,6,3,9,8,1,1], 3,1)); 
0

Это мой код:

function destroyer(arr) { 
 
    var argsBeRemove = [...arguments]; 
 
    argsBeRemove.shift(); 
 
    return arr.filter(val => { 
 
    return argsBeRemove.indexOf(val) == -1; 
 
    }); 
 
} 
 

 
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));

+0

Хотя этот код может ответить на вопрос, обеспечивая дополнительный контекст относительно того, почему и/или, как этот код отвечает на вопрос улучшает его долго- долгосрочное значение. –

0

Вот моя версия Найти и уничтожить. Я предполагаю, что во входных элементах нет нулевых элементов (это допущение позволяет передать вызов). Но таким образом я могу сделать найденные элементы равными нулю, а затем просто отфильтровать их. Это довольно прямолинейно и беспорядок индекса при удалении элементов для циклов.

function destroyer(arr) { 
// Remove all the values 
var args = Array.prototype.slice.call(arguments); 

var temp=[]; 
    temp = arguments[0].slice(); 

    for (j=1; j<args.length; j++){ 

    for (i=0; i<arguments[0].length; i++){ 

    if(arguments[0][i]==arguments[j]){ 

    temp[i]=0;    
    } 
    } 
} 

function isZero(value) { 
return value !== 0; 
} 

var filtered = temp.filter(isZero); 

return filtered; 

}

0
function destroyer(arr) { 

    var args = Array.prototype.slice.call(arguments, 1); 
    return arr.filter(destroyNum); 

    function destroyNum(element) { 
     return !args.includes(element); 
    } 
} 
+1

Попытайтесь объяснить свои ответы. Это дает больше ясности и понимания. –

0

Попробуйте это:

function destroyer(arr) { 
    /* Put all arguments in an array using spread operator and remove elements 
    starting from 1 */ 
    const args = [...arguments].splice(1); 
    /* Check whether arguments include elements from an array and return all that 
    do not include(false) */ 
    return arr.filter(el => !args.includes(el)); 
} 

destroyer([1, 2, 3, 1, 2, 3], 2, 3); // [1, 1] 
Смежные вопросы