有人可以帮我解释一下这行JavaScript代码吗?谢谢

时间:2020-07-17 10:18:57

标签: javascript

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)

我知道过滤功能的作用。但是我对括号内的声明感到困惑。 有人可以解释一下吗?非常感谢。

4 个答案:

答案 0 :(得分:2)

nums = nums.filter(val => val == nums[n] || val % nums[n] != 0)
  1. 数字是一个数组
  2. 正在使用一个名为Filter的高阶函数,您可以在filter的mdn https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter上阅读更多内容
  3. 如果迭代中的当前值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的第一行,因为该行不是以varconstlet开头...

这就是为什么在定义nums时可以使用它的原因。您正在使用nums的上一个值作为新值。

filter()创建一个数组,其中填充了所有通过测试的数组元素(作为函数提供)。

您可以使用下面的链接全面了解.filter()

https://www.w3schools.com/jsref/jsref_filter.asp

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;