如何向动态数组添加元素并排除现有元素

时间:2015-03-04 16:58:48

标签: javascript arrays dynamic-arrays

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

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


 });
return numCent;
}  

这是我当前的代码,它试图做的是读取一个数组,如果已经有一个元素退出循环并说“#34;”你已经记录了",显然如果它找不到类似的元素然后它将它推送到数组。

我希望它能动态工作,所以我们事先不能知道数组的大小,所以作为参数传递的第一个元素应该放入数组中,(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方法非常偏爱,非常感谢你们。

4 个答案:

答案 0 :(得分:0)

对于每次不匹配,你都在推动这个数字。使用类似这样的东西

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

    return numCent;
} 

答案 1 :(得分:0)

使用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数组声明感到困惑。我认为,根据你问题的内容,你的意思就是这个。

答案 2 :(得分:0)

如果你想在实例中保存数组,你可以这样做。

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()来确保每次都在正确的上下文中调用函数,如果你想知道为什么我这样调用它。

答案 3 :(得分:0)

干净利落地做这件事,我会考虑对全局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);