簡體   English   中英

JavaScript使用過濾器和循環從陣列中刪除多個值

[英]JavaScript Remove Multiple Values from Array Using Filter and Loop

我是新來的,需要一些幫助來編寫函數destroyer()以從數組中刪除多個值。

destroyer()函數傳入一個數組和其他數字作為參數。 我們的想法是從數組中刪除數字。

例如

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

輸出: [1, 1]

destroyer(["tree", "hamburger", 53], "tree", 53) 

輸出: ["hamburger"]

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

輸出: []

注意:示例僅顯示要刪除的2個附加數字。 但是函數destroyer()應該能夠刪除任意數量的值(即4個,5個或6個參數)。

但是,我的代碼不會產生相同的結果。 具體來說,使用console.log,我發現我的過濾器功能沒有正確循環。

1)任何人都可以幫我調試嗎?

2)有沒有更好的方法來編寫這個函數?

非常感謝你!!!

function destroyer() {

  var args = Array.prototype.slice.call(arguments); 

  var itemToRemove = args.slice(1);
  console.log(itemToRemove);
  var newArr = args[0];
  console.log(newArr);

  function filterer(value) { 

    for (var i = 0; i < itemToRemove.length; i++) {
      console.log(i);
      console.log(itemToRemove[i]);
      if (value != itemToRemove[i]) {
        return value;
      }
    } 
   }

  return newArr.filter(filterer);
}

您的filterer功能可以更簡單:

function filterer (value) {
    return itemToRemove.indexOf(value) === -1;
}

與時間復雜度方面的對象屬性查找相比,使用Array.prototype.indexOf()可能效率低下。 我建議一次循環其他參數並構造一個目標元素作為鍵被銷毀的對象。 然后,您可以在傳遞給Array.prototype.filter()的過濾回調中檢查給定值是否為目標。

function destroyer() {
    var arr = arguments.length && arguments[0] || [];
    var targets = {};
    for (var i = 1; i < arguments.length; i++) {
        targets[arguments[i]] = true;
    }
    return arr.filter(function (x) {
        return targets[x] === undefined;
    });
}

這種方法的一個缺點是,並非JS中的所有值都可以是對象的有效屬性,因為屬性必須是字符串。 在這種情況下,您只是使用數字作為鍵,這些數字被隱式轉換為字符串。

我們可以在filter()方法中將參數傳遞給我們的回調函數。

function destroyer(arr) {
  return arr.filter(filterer(arguments)); // Pass arguments
}

function filterer(args) {
  return function(value) { // Actual filter function
    for (var i = 1; i < args.length; i++) {
      if (value === args[i]) // Seek
        return false; // Destroy
    }
    return true; // Otherwise keep
  };
}

這傳遞了freeCodeCamp的所有5個測試用例 基本算法腳本| 尋求和毀滅

以下代碼將從數組中刪除元素。 它刪除的元素由任何額外參數定義。 ...remove是一項ES6功能,可將額外參數聚合到一個數組中。

我將迭代...remove數組並從我們正在處理的主數組中刪除該元素。

這是一個JSFiddle: https ://jsfiddle.net/zzyopnnp/

...extra_parameters在大多數瀏覽器中不支持...extra_parameters ,您可能希望使用arguments對象。

function removeIndex(array, index) {if(index>-1){array.splice(index, 1);}}

function destroyer(array, ...remove) {
    remove.forEach(function(elem, index) {
        removeIndex(array, index);
    });
};

var arr = ["tree", "hamburger", 53];
destroyer(arr, "tree", 53);
console.log(arr);

一個簡單的功能

function filter(arr, arg1, arg2){

    var j = arr.length;
    while(j){

       if (arr.indexOf(arg1) > -1 || arr.indexOf(arg2) > -1){
          arr.splice(j - 1, 1);
       }
       j--
    }
}

對於多個參數

一個簡單的功能

function filter(){
    var j = -1; 
    for(var i = 1; i < arguments.length; i++){
        j = arguments[0].indexOf(arguments[i]);
        if(j > -1){
           arguments[0].splice(j, 1);
        }
    }
    return arguments[0];
}

你可以調用這個沒有args的函數,例如:

 filter([1,2,3,4,5,6,7,8,9], 1, 3, 5); //return [2,4,6,7,8,9]
 filter([1,2,3,4,5,6,7,8,9], 1); //return [2,3,4,5,6,7,8,9]

這里有很好的答案,但你可以用這種方式做得非常干凈,記住你在filter方法中有一個對象選項,你可以在回調函數中使用,在這種情況下我使用它就像: arguments [i]所以我可以檢查arguments數組中的每個值

function destroyer(arr) {

   for(var i = 1; i < arguments.length; i++){
     arr = arr.filter(isIn, arguments[i]);
   } 

   function isIn(element,index, array){
      if (element != this){
         return element;
      }
   }  
   return arr;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM