编程语言
首页 > 编程语言> > javascript – 嵌套ES6数组辅助方法以生成素数数组

javascript – 嵌套ES6数组辅助方法以生成素数数组

作者:互联网

所以我想写一个函数,它返回所有素数的总和,包括提供的数字.

我写了这个,有效:

function sumPrimes(num) {
  const arr = Array.from({length: num+1}, (v, k) => k).slice(2);
  return arr.filter(element => {
  	for(let i = 2; i < element; i++) {
          if(element % i === 0) {
              return false;
          }
      }
      return element;
  }).reduce((previous, current) => {
  	return previous += current;
  }, 0);
}

sumPrimes(9);

我认为如果用另一个数组辅助方法替换for循环,它看起来会更整洁.然而,我正在努力实现这一点.

这是我到目前为止所得到的:

function sumPrimes(num) {
  const arr = Array.from({length: num+1}, (v, k) => k).slice(2);
  return arr.filter(element => {
  	return arr.find(ref => {
      console.log("(" + element + " % " + ref + " === 0) " + (element % ref === 0));
    	if(element % ref === 0) { return false; }
      return true;
    });
  }).reduce((previous, current) => {
  	return previous += current;
  }, 0);
}

sumPrimes(20);

写得像这样,函数不再按预期工作 – 它不会过滤任何数字,所以所有数字都由.reduce助手相加.控制台使得if语句看起来仍然可以正常工作;我究竟做错了什么?

解决方法:

您的代码使用find无法工作的原因是因为find不是for循环的正确替代品.你在这里的for循环返回一个布尔值,表明是否找到了除数.另一方面,找到除数本身.这意味着您的过滤方法的所有条件都是大于1的数字,所有条件都评估为真实,因此没有任何过滤.

对于您的用例,更合适的方法是someevery.
这些基本上像find一样工作,除了在找到满足条件的元素时返回一个布尔值.

>一些停止并在谓词函数为某个元素返回true时立即返回true.
否则返回false.
>每个stop,并在谓词函数为某个元素返回false时返回false.
否则返回true.

还有一个问题是,使用这样的帮助程序会降低您的代码效率,因为您现在正在检查所有数字,而不仅仅是当前数字.这意味着您的谓词函数也必须包含此相等性检查,或者您必须首先过滤所检查元素的所有元素的数组.

效率方面的另一个小改进是你不需要一直迭代到元素-1来找到一个除数.迭代到sqrt(元素)就足够了,因为所有高于sqrt(元素)的数字,除了元素都会在sqrt(元素)之下的某处有一个补码除数.

这是一种使用every的方法,并过滤掉被检查元素的平方根之下的元素.

function sumPrimes(num) {
  const arr = Array.from({length: num+1}, (v, k) => k).slice(2);
  return arr.filter(element => {
    return arr
      .filter(ref => ref*ref <= element)  // filter elements less than sqrt(current)
      .every(ref => element % ref !== 0); // filter elements that have a divisor
  }).reduce((previous, current) => {
    return previous += current;
  }, 0);
}

console.log(sumPrimes(9)); // 17

也许功能较少但效率较高(和IMHO同样干净)的方法是将for循环转换为辅助函数:

function isPrime(element) {
  for(let i = 2; i*i <= element; i++) {
    if(element % i === 0) {
      return false;
    }
  }
  return true;
}

function sumPrimes(num) {
  return Array
    .from({ length: num+1 }, (v, k) => k)
    .slice(2)
    .filter(isPrime)
    .reduce((previous, current) => previous + current, 0);
}

console.log(sumPrimes(9)); // 17

标签:helpers,javascript,arrays,ecmascript-6,primes
来源: https://codeday.me/bug/20190828/1754451.html