将非重复数字添加到数组中

时间:2017-08-06 19:12:05

标签: javascript arrays

我在javaScript中编写了一个函数来检查它是否是第一次出现数字,如果是,它将被添加到数组中。出于某种原因,第一个数字总是重复它,例如:

如果我们通过[1,1,1,2,3,3,4,5] 它将打印出[1,1,2,3,4,5]而不是[1,2,3,4,5]

谁能告诉我我错过了什么? 提前谢谢。

var numbers = [1,1,1,1,1,2,3,4,4,4,5,5,6,6,6,8];
function eliminateDup(arr){

    var myArr = [];

    for(var i = 0;i<arr.length;i++){

        if(!myArr[arr[i]]){

            myArr.push(arr[i]);
        }
    }
    return myArr;
}
console.log(eliminateDup(numbers));

3 个答案:

答案 0 :(得分:1)

这种比较没有意义:

if(!myArr[arr[i]]){

true仅当!myArr[arr[i]]可以转换为true时才会1 您在目标数组myArr中获得两次arr[0],因为arr[1]1都等于myArr1i = 0 arr[0] = 1 myArr[1] = undefined 处有一个未定义的元素{1}}执行条件语句时的两次第一次迭代的索引。

第一次迭代

if(!myArr[1])

所以true1 您添加i = 1 arr[1] = 1 myArr[0] = 1 // now valued but not used in the test myArr[1] = undefined;

第二次迭代

if(!myArr[1])

所以true1 您仍然添加i = 2 arr[2] = 1 myArr[0] = 1 myArr[1] = 1

第三次迭代

if(!myArr[1])

所以falseif(myArr.indexOf(arr[i])==-1){ myArr.push(arr[i]); } 没有添加任何内容。

在将目标数组添加到目标数组中之前,您应该检查当前值是否未包含在目标数组中:

rank()

答案 1 :(得分:0)

使用此条件代替推送

if(myArr.indexOf([arr[i])===-1)

答案 2 :(得分:0)

myArr.push(arr[i]);会推回数组myArr(就像堆栈一样),因此元素&#39; 1&#39;将在索引0。

myArr[arr[i]]检查索引arr[i]处的元素是否存在,但是将推送另一个

如上所述,使用indexof()只会搜索并在元素存在时给出索引。