使用滤波器方法从数组中提取彼此之间具有精确间隙的数字


primes.filter((value, index) => value[index] + g === value[index + 1]);

问候。。我有一个数组primes,其中有一些素数在一定范围内,我有g,这是我需要过滤的步长或间隙。我想返回一个数组,其中有连续素数,它们之间有这个特定的数字间隙。例如,如果间隙为4.,那么我需要返回[7, 11]。不确定在这种情况下如何使用filter。。很明显,我尝试做的并没有奏效。而且如果我能只返回第一次出现这样的差距,那就更好了。

您的代码很接近,但value只是当前索引处的值,因此您不能使用它来访问数组中的其他值。相反,传递给filter回调的第三个参数可以访问数组。

另一个问题是,如果你想同时获得两个数字,你可能需要检查反转(即,如果一个数字的g大于前一个数字(。

您会在这里看到,这会返回所有匹配的实例,所以如果您只想要第一个实例,我建议您使用像find这样的数组方法,而不是filter

const g = 4;
const primes = [2, 3, 5, 7, 11, 13, 17, 19];
const filtered = primes.filter((value, index, arr) => {
return value + g === arr[index + 1] || value - g === arr[index - 1];
});
console.log(filtered);

如果确实只想要第一个匹配,那么您可以使用find方法来获得第一个值,并且您会知道第二个值比第一个值大g

const g = 4;
const primes = [2, 3, 5, 7, 11, 13, 17, 19];
const first = primes.find((el, index, arr) => el + g === arr[index + 1]);
console.log([first, first + g]);

您的代码中有三个问题:

1:value不是阵列

2:它需要双向工作才能同时获得711

3:你需要给过滤后的值分配一些东西(显然(

这应该有效:

var primes = [2, 3, 5, 7, 11, 13, 17];
var g = 4
result = primes.filter((value, index) => value + g == primes[index + 1] || value - g == primes[index-1]);
console.log(result)

const primes = [307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397];
const g = 8;
// Assuming they're in order, and you don't care about non-consecutives
const resA = primes.filter((v, i) => v + g === primes[i + 1] || v - g === primes[i - 1]);
console.log(resA); // [359, 367, 389, 397]
// Works with an unordered Array, but more greedy
const resB = primes.filter((v, i) => primes.some(n => Math.abs(v - n) === g));
console.log(resB); // [359, 367, 389, 397]

最新更新