2016-01-23 81 views
-4

我很困惑这个代码是什么样的,所以任何人都可以向我阐述它背后的原因。JavaScript数组差异

function diff(arr1, arr2) { 
var newArr = []; 
var h1 = Object.create(null); 
arr1.forEach(function(e) { 
    h1[e] = e; 
}); 

var h2 = Object.create(null); 
arr2.forEach(function(e) { 
    h2[e] = e; 
}); 

Object.keys(h1).forEach(function(e) { 
    if (!(e in h2)) newArr.push(h1[e]); 
}); 
Object.keys(h2).forEach(function(e) { 
    if (!(e in h1)) newArr.push(h2[e]); 
}); 

return newArr; 
} 

我发现它时,我正在寻找如何让JavaScript数组之间的区别

breif解释将有助于充分

回答

1

比较2个阵列,并找到所有的差异是缓慢的。原因是因为查找时间不够快。

假设你有以下几点:

var arr1 = [1,2,3,4]; 
var arr2 = [5,6,7,8]; 

你需要的是找到ARR1在ARR2每个值,是不是在ARR1每个值,是不是在ARR2,和。要做到这一点,你循环arr1并问“这是arr2的值?”但是每次你问这个问题,你都必须循环arr2。然后,你必须用arr2再次重复这个,在arr1中查找每个值。

这个Javascript方法加快了速度。在Javascript中,对象被创建为一组唯一的键和相应的值。例如:现在

var obj1 = {a: "string a", 6: "number 6"}; 

,我可以说obj1['a'],它会返回“字符串”。不仅键和值可以在任何时间(数字,字符串,对象),但查找是即时的。我们不再需要查看obj1中的每个关键字,所以如果我们能够利用这一点,我们的逻辑将会更快。

此Javascript方法所做的第一件事是将两个数组转换为对象。它使用Array值作为Object键和值,最后以h1和h2结束。

然后,它执行上面提到的逻辑。它查看h1中的每个键(此优化消除了重复的Array值,因为Object键必须是唯一的),并且如果该键不在h2中,它会将值添加到newArr。然后重复h2中的所有密钥。

基本上,它通过将我们缓慢的Array值重新组织为快速键值对象来优化搜索,然后进行必要的比较。

+0

非常感谢你@Nate我现在明白了,我可以在另一个地方使用它 – Yya09