这个未定义的值来自哪里?

时间:2016-03-29 14:49:51

标签: javascript

我正在尝试比较两个数组并返回一个新数组,其中只有在两个给定数组之一中找到的任何项目。

e.g。比较[1,2,3,4][1,2,3]的结果应为:[4]

问题是,我在循环执行后得到'undefined'元素。

function diff(arr1, arr2){
    var newArr = [];
    for(i=arr1[0]; i<=arr1.length; i++){
      if(arr2.indexOf(arr1[i])=== -1){ 
        newArr.push(arr1[i]);
      }
    }
    console.log(newArr);
};

diff([1,2,3,4], [1,2,3]);

结果是[4, undefined]。我做错了什么?

2 个答案:

答案 0 :(得分:1)

您的for循环定义不正确。它应该从i=0开始,一直运行到i<arr1.length

function diff(arr1, arr2){
    var newArr = [];
    for(i=0; i<arr1.length; i++){
      if(arr2.indexOf(arr1[i])=== -1){ 
        newArr.push(arr1[i]);
      }
    }
    console.log(newArr);
};

通过运行直到i<=arr1.length,您尝试迭代一次以上,导致在结果数组中添加最终的未定义值。正如Mario Garcia在评论中所说,在最后一次迭代中,循环将尝试访问不存在的arr[4],因此未定义。

答案 1 :(得分:0)

你的循环是错误的,因为你的迭代器不是从0开始(以匹配第一个数组元素),而是从索引零处的数组值开始(在你的情况下是数字1,但可能是几乎任何东西);然后当迭代器达到数组的长度时你会超出索引范围,在你的情况下它是4,而 arr1 [4]是未定义的

在修复循环起始值和条件后,我们得到:

&#13;
&#13;
function diff(arr1, arr2){
    var newArr = [];
    for(i = 0; i < arr1.length; i++){
      if(arr2.indexOf(arr1[i])=== -1){ 
        newArr.push(arr1[i]);
      }
    }
    alert(newArr);
};

diff([1,2,3,4], [1,2,3]); // 4
diff([1,2,3,4,5], [1,3]); // 2, 4, 5
&#13;
&#13;
&#13;