我目前正在研究Javascript算法。下面是即时通讯正在尝试学习/理解的算法。
function same(arr1, arr2){
if(arr1.length !== arr2.length){
return false;
}
let frequencyCounter1 = {}
let frequencyCounter2 = {}
for(let val of arr1){
frequencyCounter1[val] = (frequencyCounter1[val] || 0) +1
console.log(frequencyCounter1);
}
for(let val of arr2){
frequencyCounter2[val] = (frequencyCounter2[val] || 0) +1
}
for(let key in frequencyCounter1){
if(!(key ** 2 in frequencyCounter2)){
return false
}
if(frequencyCounter2[key ** 2] !== frequencyCounter1[key]){
return false
}
}
return true
}
same([1,2,3,2,5], [9,1,4,4,11])
我理解代码,只有1行。
frequencyCounter1[val] = (frequencyCounter1[val] || 0) +1
因此,此算法的作用是尝试比较2个数组。如果数组b等于每个数字的平方等于数组a,则它应返回true,否则将返回false。
因此在此示例中,它将返回false
如果我执行[1,2,3,4,5] [1,4,9,16,25],它将返回true
我知道这行的作用:
frequencyCounter1[val] = (frequencyCounter1[val] || 0) +1
它构成一个键值对,所以说在第一次迭代中,它以1作为键,然后以(frequencyCounter1 [val] || 0)+1作为值,现在该值表示一个a的数量。数组中出现一个数字的次数,因此,如果1出现10次,它将有一个键值对1:10
我非常清楚地理解了这一点,只是想知道如何评估该陈述以及幕后发生的事情?
(frequencyCounter1 [val] || 0)+1
答案 0 :(得分:5)
这个想法是,如果frequencyCounter1[val]
为undefined
,则默认为0
。 undefined + 1
返回NaN
,它无法按程序员的预期工作,因此他使用||
来解决该问题,而不必编写其他代码。
在JavaScript中,运算符||
不返回您期望的true
或false
,它返回第一个元素,如果它是true
转换为布尔值,如果找不到则默认为最后一个元素。
例如,(null || "" || undefined || false || NaN || "test" || 2)
将返回"test"