簡體   English   中英

如何向動態數組添加元素並排除現有元素

[英]How do I add elements to a dynamic array and exclude exsisting elements

function addNumifnotThere(numer){
   var numCent = [];

     numCent.forEach(function(){
        if(numer in numCent)
         console.log("you logged that");
        else
         numCent.push(numer);


 });
return numCent;
}  

這是我當前的代碼,它試圖做的是讀取一個數組,如果已經有一個元素退出循環並說“你已經記錄了”,顯然如果它找不到類似的元素,那么它將它推送到數組。

我想讓它動態工作,所以我們事先不能知道數組的大小,所以作為參數傳遞的第一個元素應該放入數組中,(addNum(1)應該有數組打印輸出[1],調用addNum( 1)再次打印“你已經記錄了”)

然而,這有兩個問題1)嘗試推送到沒有任何條目的新數組意味着一切都是未定義的,因此嘗試遍歷數組只會導致程序打印[]。

2)向數組中添加一些隨機元素以使其工作,在這種情況下,numCent = [1,2,3]還有其他問題,主要是添加3以上的數字會導致代碼打印不正確的信息。 在這種情況下,addNum(5)應該打印[1,2,3,5],而是打印[1,2,3,5,5,5]

我知道這必須是一個簡單的錯誤,但我一直拖着自己太長時間沒有尋求幫助。

編輯:感謝這里的許多優秀答案,我現在對indexOf方法很偏愛,非常感謝你們。

對於每次不匹配,你都在推動這個數字。 使用這樣的東西

var numCent = [];
function addNumifnotThere(numer)
{
    var index = numCent.indexOf(number);
    if(index >=0)
    {
       console.log("you logged that");
    }
    else
    {
       numCent.push(number);
    }

    return numCent;
} 

使用Array.prototype.indexOf

 var numCent = []; function addNum(numer){ if (numCent.indexOf(numer) > -1) { console.log("Number already in array"); } else { numCent.push(numer); } } //DEMO CODE, not part of solution document.querySelector("button").addEventListener("click", function(){ if (document.querySelector("input").value.length > 0) { addNum(document.querySelector("input").value); document.querySelector("div").innerHTML = numCent.join(", "); } }, false); 
 Output <div id="output"></div> <input /> <button>Add number</button> 

indexOf測試元素是否在數組內並返回其索引。 如果沒有找到它將返回-1 你可以測試一下。 您可以在此代碼段中嘗試自己。 它只允許您添加一個數字(或此示例中的任何字符串)一次。

我也對函數內部的newCent數組聲明感到困惑。 我認為,根據你問題的內容,你的意思是這個。

如果你想在實例中保存數組,你可以這樣做。

function AddIf(arr){
  if( arr || !this.arr ) {
    this.arr = arr || [];
  }

  return function(number) {
    if( this.arr.indexOf(number) >= 0 ) {
      console.log("Already Present!");
    } else {
      this.arr.push(number);
    }

    return this.arr;
  }.bind(this);
}

// Usage would be like this:
// var addIf = new AddIf([1, 2, 3]);
// addIf(10);  // returns [1, 2, 3, 10]
// addIf(10);  // logs "Already Present!", doesn't add 10 to array

這基本上返回一個函數, this函數綁定到被調用的函數。 如果傳入一個初始數組,它將使用該數組進行比較,以便將其添加到數組中。

您可以捕獲返回功能並按照您的意願調用它。 但是,如果在調用時不調用new ,它將共享相同的數組實例(並且有一種時髦的方式被調用, AddIf()(10) )。

我使用fn.bind()來確保每次都在正確的上下文中調用函數,如果你想知道為什么我這樣調用它。

干凈利落地做這件事,我會考慮對全局Array對象進行原型設計並添加推送值的方法,但前提是它們對於數組是唯一的。 像這樣的東西:

Array.prototype.pushUnique = function (item) {
    if (this.indexOf(item) != -1) {
        console.log("Item with value of " + item + " already exists in the array."
    }
    else {
        this.push(item);
    }
}

如果您不熟悉像Array這樣的全局類型的原型,您可以在過程模式中構建相同的東西:

function arrayPushUnique (arr, item) {
    if (arr.indexOf(item) != -1) {
        console.log("Item with value of " + item + " already exists in the array."
    }
    else {
        arr.push(item);
    }
}

然后使用它,只需創建一個新的空數組並開始向它推送。

var numCent = [];
// The Array.prototype method
numCent.pushUnique(number);
// The procedural method
arrayPushUnique(numCent, number);

暫無
暫無

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

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