freecodecamp挑战 - 寻求和摧毁

时间:2016-03-29 12:21:21

标签: javascript

我正在努力解决这个挑战寻求和摧毁。我无法弄清楚出了什么问题。有什么帮助吗?

寻求并摧毁 您将获得一个初始数组(驱逐舰函数中的第一个参数),后跟一个或多个参数。从初始数组中删除与这些参数具有相同值的所有元素。

这是下面的初始代码:



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);
&#13;
&#13;
&#13;

提前致谢!

12 个答案:

答案 0 :(得分:5)

您可以创建一个应该删除的所有值的数组。然后使用Array.filter过滤掉这些值。

注意:Array.splice将更改原始数组。

&#13;
&#13;
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));
&#13;
&#13;
&#13;

答案 1 :(得分:2)

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));
}

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

答案 2 :(得分:1)

这对我有用:

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)
);

答案 3 :(得分:1)

//解决FreeCodeCamp上的Seek和Destroy挑战的两种方法  //我试图简化此代码,请发布您的解决方案,简化代码  //尽可能多的

 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));

答案 4 :(得分:1)

这是我的代码:

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));

答案 5 :(得分:1)

这是我的Seek and Destroy版本。我假设输入中没有零元素(该假设允许通过挑战)。但是这样我可以使找到的元素等于零,然后将它们过滤掉。在for循环中删除元素时,它非常简单,没有索引混乱。

&#13;
&#13;
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;
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
&#13;
&#13;
&#13;

答案 6 :(得分:1)

&#13;
&#13;
function destroyer(arr) {

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

     function destroyNum(element) {
         return !args.includes(element);
     }
}
console.log(destroyer([1, 2, 3, 1, 2, 3], 2, 3));
&#13;
&#13;
&#13;

答案 7 :(得分:1)

  

将为您提供一个初始数组(destroyer函数中的第一个参数),后跟一个或多个参数。从初始数组中删除所有与这些参数具有相同值的元素。

接受的解决方案将返回一个新数组,而不是从现有数组中删除元素。

这可以通过反向迭代数组并删除与任何过滤器参数匹配的任何元素来有效实现。

function destroy(original, ...matches) {
  if('length' in original) {
    let index = original.length
    while(--index > -1) {
      if(matches.includes(original[index])) {
        original.splice(index, 1)
      }
    }
  }
  return original;
}

const original = [1, 2, 3, 1, 2, 3]
destroy(original, 2, 3)
console.log(original);

答案 8 :(得分: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);

答案 9 :(得分:0)

试一试,它的复杂程度就会降低:

function destroyer(arr) {
  // arr1 is equal to the array inside arr
  var arr1 = arr.slice(arguments);
  // arr2 becomes an array with the arguments 2 & 3
  var arr2 = Array.prototype.slice.call(arguments, 1);
  // this function compares the two and returns an array with elements not equal to the arguments
  return arr1.concat(arr2).filter(function(item) {
    return !arr1.includes(item) || !arr2.includes(item)
  })
}


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

答案 10 :(得分:0)

我们可以获取数组后面的参数,这些参数是需要删除的参数并将其存储到列表中。然后,我们可以使用过滤器过滤掉需要删除的数字。

function destroyer(arr) {
 let removeList=[...arguments].slice(1);
 return arr.filter(e=>removeList.indexOf(e)===-1);
}

答案 11 :(得分:0)

我知道这不是最短的方法,但我认为在中级水平上更容易理解。

function destroyer(arr, ...elements) {
  var i =0;
  while(i<=arr.length){                    //for each element into array 
    for(let j =0; j<elements.length; j++){ //foreach "elements"
      if(arr[i]==elements[j]){             // Compare element arr==element
        arr.splice(i,1);                   //If are equal delete from arr
        i--;                               //Check again the same position
        j=0;                               
        break;                             //Stop for loop
      }
    }
    i++;
  }
   return arr;
}

console.log(destroyer(["possum", "trollo", 12, "safari", "hotdog", 92, 65, "grandma", "bugati", "trojan", "yacht"], "yacht", "possum", "trollo", "safari", "hotdog", "grandma", "bugati", "trojan"));
console.log(destroyer([1, 2, 3, 5, 1, 2, 3], 2, 3));