function sumPrimes(num) {
let nums = Array.from({ length: num + 1 })
.map((_, i) => i)
.slice(2);
for (let n in nums) {
nums = nums.filter(val => val == nums[n] || val % nums[n] != 0);
}
return nums.reduce((prevSum, cur) => prevSum + cur);
}
这是一个简单的函数,用于将素数加到num
。
我是javascript新手,以下这行确实让我感到困惑。
nums = nums.filter(val => val == nums[n] || val % nums[n] != 0)
我知道过滤功能的作用。但是我对括号内的声明感到困惑。 有人可以解释一下吗?非常感谢。
答案 0 :(得分:2)
nums = nums.filter(val => val == nums[n] || val % nums[n] != 0)
filter
的mdn https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter上阅读更多内容Val
等于nums[n]
或未完全除以nums[n]
,那么它将被返回,否则将不返回。答案 1 :(得分:1)
我认为您需要了解的关键是必须在该行之前的for语句的上下文中考虑该行。
for (let n in nums) {
nums = nums.filter(val => val == nums[n] || val % nums[n] != 0);
}
乍看之下,看起来“ val == nums [n]”将始终为真。让我们看看为什么不是这种情况。
每次运行filter方法的功能时,都有很多要评估的东西:
a)nums的内容
b)n的值
c)nums [n]
的值d)val的值
e)“ val == nums [n]”的值
f)“ val%nums [n]!= 0”的值
需要对.filter函数中的每个调用进行评估。
让我们看看在第一次调用filter函数时的外观。在第一个通话期间:
a)nums的内容为{2,3,4,5,6,7,8,9,10}
b)n的值为0
c)nums [n]的值为nums [0],即2
d)val的值为2
e)“ val == nums [n}]”的值变为“ 2 == 2”,这是正确的
f)“ val%num [n]!= 0”的值变为FALSE
因此,由于“ val == nums [n}]”为TRUE,因此第一个元素将保留为nums。
接下来,过滤器将对val = 3进行评估,依此类推。
一旦过滤器通过n = 0,它将以n = 1进行。
请记住,在每次运行.filter时都会修改nums。
答案 2 :(得分:0)
nums = nums.filter(val => val == nums[n] || val % nums[n] != 0)
让我们从头开始。
这一行说的是nums = nums
(该值)。
您可以说这行不是使用nums
的第一行,因为该行不是以var
,const
,let
开头...
这就是为什么在定义nums
时可以使用它的原因。您正在使用nums
的上一个值作为新值。
filter()
创建一个数组,其中填充了所有通过测试的数组元素(作为函数提供)。
您可以使用下面的链接全面了解.filter()
。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter
如果迭代val => ...
中的当前值val
等于nums[n]
或(||
表示)不能完全除以{ {1}},因此不等于nums[n]
(用0
表示),否则它将返回。
我希望这可以解决您的问题并帮助您更好地理解该行代码!
答案 3 :(得分:0)
nums = nums.filter(val => val == nums[n] || val % nums[n] != 0)
1。更新`nums
的值将nums
的值重新分配到一个新数组,当nums
函数的回调返回true时,该数组将包含filter
数组的初始值中的项。
nums = nums.filter(val =>回调)
2。回调
val => val == nums[n] || val % nums[n] != 0
以上行等效于
function (val) {
return val == nums[n] || val % nums[n] !=0;
}
如果在 LOOP 内部形成
// considere firstly `nums` = [2,4,5,7,8]
let nums = [2,4,5,7,8];
for(let n in nums) {
nums = nums.filter((val) => {
console.log(`for n = ${n} ==> .filter is called with val = ${val}`);
console.log(`So val === nums[n] return ${val == nums[n]}`);
return val == nums[n] || val % nums[n] != 0;
});
console.log(`==================================`);
}
console.log(nums);
我只会在第一次执行for循环时进行解释
所以请考虑
let nums = [2,4,5,7,8];
第一次执行for循环时,变量n
是 FOR LOOP 的 index ,n
= { {1}}和0
= val
回调通过将其等于{p>
2
等于
val => val == nums[n] || val % nums[n] != 0
或
return 2 == nums[0] || 2 % nums[0] != 0;