有关javascript in 关键字的注意事项

有关javascript in 关键字的一个注意点

今天有个网友闻到一个问题,如何求两个数组的交集.咋一看很简单,就顺手写了一个,还满沾沾自喜 。 代码如下

var arrA = [102,2,9,100],arrB = [88,2,6,222],result = [];
for(var k =0;k < arrA.length;k++){
	if(arrA[k] in arrB){
		result[result.length] = arrB[k];
	}
}
console.log(result);

猛一看运行结果,还挺对。可是改下数据就出问题了

var arrA = [102,2,9,100],arrB = [88,23,6,222],result = [ ];
for(var k =0;k  < arrA.length;k++){
	if(arrA[k] in arrB){
		result[result.length] = arrB[k];
	}
}
console.log(result);

运行结果如下
有关javascript  in 关键字的注意事项 第1张

这个结果一看就让人匪夷所思。。

仔细思考了一下。明白过来了, a in B 这样的语法,表示的是key-value类型的数据的key的标记,而不是value,这个key在数组里面就是数组的下标。 就是说 判断的是a是否在B这个key-value 数据对象的key里面,而不是value里.

那么回到问题之初如何求俩数组的交集捏 一个简单的例子如下:

var arrA = [89,55,44,852], arrB = [89,109,25,69,44],result = [];
var temp = ","+arrB.join(",") +",";
for(var i = arrA.length-1;i > -1;i--){
    if(temp.indexOf(arrA[i])>0){
        result[result.length] = arrA[i];
    }
}
console.log(result);

思路二 利用桶排序的原理,在数组里的数字范围不是很大的情况下可以利用空间换时间的办法,比如数组里的元素范围在1万以内,我们可以声明一个元素个数为1w的数组 P, 然后把A数组袁旭大小挨个放进这个P对应的序号的元素里;然后遍历B数组,如果B数组元素对应的P的元素序号不为空,则记录下来,这样就可以了。 简单的示例代码如下

var arrA = [89,55,44,28], arrB = [89,19,25,69,44],p = [];
for(var i = 0; i  < arrA.length;i++){
    p[arrA[i]] = 1;
}
for(var k = 0; k < arrB.length;k++){
    if(p[arrB[k]]!=undefined){
        console.log(arrB[k]);
    }
}
这个思路的高效之处在于他只对每个数组进行了一次循环,而且N个数组求交集也可以这样,当然前提是数组元素的分布范围不能太大。
本文标题:有关javascript in 关键字的注意事项
本文链接:https://56way.com/p/7.html
作者授权:除特别说明外,本文由 无路 原创编译并授权 小无路 刊载发布。
版权声明:本文不使用任何协议授权,您可以任何形式自由转载或使用。

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。