Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript从数组中的高点组中选择峰值数_Javascript_Arrays_Filter - Fatal编程技术网

Javascript从数组中的高点组中选择峰值数

Javascript从数组中的高点组中选择峰值数,javascript,arrays,filter,Javascript,Arrays,Filter,很难用标题来描述它,但从这里的描述和代码中应该很清楚。我试图从一组峰值中找出数组中的最大值,然后进入下一组,从下一组高点中得到下一个峰值 例如,在这个数组中: const arr = [939, 1301, 253, 1380, 1037, 2279, 2462, 2193, 2121, 1424, 506, 2411, 2456, 2295, 915, 1276, 1532, 1359, 985, 2182, 2407, 2103, 2392, 2294, 765, 1195, 1537, 1

很难用标题来描述它,但从这里的描述和代码中应该很清楚。我试图从一组峰值中找出数组中的最大值,然后进入下一组,从下一组高点中得到下一个峰值

例如,在这个数组中:

const arr = [939, 1301, 253, 1380, 1037, 2279, 2462, 2193, 2121, 1424, 506, 2411, 2456, 2295, 915, 1276, 1532, 1359, 985, 2182, 2407, 2103, 2392, 2294, 765, 1195, 1537, 1409, 858, 1971, 2214, 1311, 1326, 1383, 1231, 1141]
我想从大约103722792462193处的第一组峰值中挑选出2462个,然后从大约5062411246222915处的下一组峰值中挑选出2456个。这些小组的位置不知道,问题是找到他们,然后从每个小组中选出一个最高的数字

这是我目前使用的函数,但它不能100%工作,也不能用于某些数组

let currHigh = 0, store = [], limit = 2100;
for (let s = 0; s < arr.length; s++) {
    if (arr[s] > limit && currHigh === 0) {
        currHigh = arr[s]
    } else if (arr[s] > limit && arr[s] > currHigh) {
        currHigh = arr[s];
    } else if (arr[s] < currHigh) {
        if (arr[s] < limit) {
            store.push(currHigh); currHigh = 0;
        }
    }
}
console.log(store)
以及另一个具有预期/期望输出的示例阵列:

const arr =  [1365, 1324, 1013, 1220, 1259, 2204, 2212, 1938, 1882, 1545, 1236, 2090, 2614, 1949, 1307, 1628, 1780, 1263, 1184, 2184, 1411, 1306, 2010, 2057, 1339, 1624, 2480, 2575, 2425, 2617, 2479, 1929, 1805, 1869, 1341, 1104, 2195, 1661, 1174, 1447, 1761, 1362, 1430]

Outputted Peaks: [2212, 2614, 2184, 2480, 2617, 2195]
编辑:为了避免一些混乱,想象一下,如果你将给定数组中的值绘制在一个图形上,那么图形中会有几个峰值间隔开。我需要一个函数来获取这些峰值。找到群只是找到峰值的一种方法。它们就像迷你们山。所以你不想得到一个高的数字,例如在“山的一边”

编辑:附加图像以解释峰值。紧挨着另一个高数字的高数字不是峰值,只有一小群相邻数字中的最高数字是峰值。

最终编辑:此图最能说明这一点,因为很难想象一个图只看阵列:


所以我需要的是图中所示的峰值[130113802462245615324072492153722141383]。然后,可以使用阈值轻松过滤这些峰值,例如消除2000以下的任何峰值。

以下是一个函数,用于查找样本数组中的所有峰值:

    const chart = [939, 1301, 253, 1380, 1037, 2279, 2462, 2193, 2121, 1424, 506, 2411, 2456, 2295, 915, 1276, 1532, 1359, 985, 2182, 2407, 2103, 2392, 2294, 765, 1195, 1537, 1409, 858, 1971, 2214, 1311, 1326, 1383, 1231, 1141]

    const findPeaks = chart => chart.reduce((agg, current, i) => {
        const prev = chart[i - 1];
        const next = chart[i + 1];

        return current > prev && current > next ? [...agg, current] : agg;
    }, []);

    const peaks = findPeaks(chart);

    console.log('peaks', peaks);
此日志:[1301138024622456153240723921537153722141383]

这与您的问题的预期输出不匹配,但它确实给出了峰值的准确答案

在这种情况下,峰值被定义为任何数量的前任和继任者都低于其自身。i、 [1100,1]给出100。[1,2,3100,3,2100,1]给出[100100]

更新

根据您的反馈,这里有一个函数,要求峰值两侧的距离为2。结果仍然与您的问题不同,但这符合新表达的标准:

const findPeaks = chart => chart.reduce((agg, current, i) => {
        const twoBack = chart[i - 2];
        const prev = chart[i - 1];
        const next = chart[i + 1];
        const twoForward = chart[i + 2];

        return (twoBack < prev && prev < current) && (current > next  && next > twoForward ) 
        ? [...agg, current] 
        : agg;
    }, []);
其输出为:


[246224562240723922214]

如果不更精确地定义所需的输出,例如,什么被认为是一个组,这里有一个简单的算法:

1将阵列拆分为低序列和高序列

例如[1,10000,100,101,20000,20050,30,10,2]=>[1]、[10000]、[100,101]、[20000,20050]、[30,10,2]。 2返回每个高位序列的最大值

let peaks=arr=>{ 设isHigh=a=>a>=2000; 让isLow=a=>!isHigha; 设群=[]; 而arr.length&&arr.someisHigh{ arr.0,arr.findindexihigh; groups.pusharr.0,arr.findIndexisLow; } return groups.mapgroup=>Math.max…group; }; const arr=[9391301、253、1380、1037、2279、2462、2193、2121、1424、506、2411、2456、2295、915、1276、1532、1359、985、2182、2407、2103、2392、2294、765、1195、1537、1409、858、1971、2214、1311、1326、1383、1231、1141]; console.logpeaksarr; const arr2=[136513241101312020125912922042081988182154512362090261949130716281780126311842184141113012010 205713391624278916242430];
console.logpeaksarr2 根据我们讨论的所有内容,以及我从您的评论中看到的,我认为以下内容应该适合您。基本上只需迭代点,检查当前点是否大于前一点和下一点,我们可以考虑那些点峰值:

函数getPeakspoints{ 让上一个; 让我们下一步; return points.filtercurr,idx,arr=>{ 如果idx>0{ prev=arr[idx-1]; } 如果idx当前{ 返回false; } } 如果下一个{ 如果下一步>当前{ 返回false; } } 返回true; }; } 常量点=[939130125313801037227924924621921211424506 24111245622959151276153213599852392229429476511951141];
console.loggetPeakspoints 为什么不保持简单呢

var arr = [1,6,4,3,9,11];

var peaks = arr.sort((a, b) => a - b).reverse();
输出为: [11,9,6,4,3,1]

然后:

结果是: [11,9,6,4,3]

或者你母亲的全部代码:

const peaks1 = [939, 1301, 253, 1380, 1037, 2279, 2462, 2193, 2121, 1424, 506, 2411, 2456, 2295, 915, 1276, 1532, 1359, 985, 2182, 2407, 2103, 2392, 2294, 765, 1195, 1537, 1409, 858, 1971, 2214, 1311, 1326, 1383, 1231, 1141];
const peaks2 =  [1365, 1324, 1013, 1220, 1259, 2204, 2212, 1938, 1882, 1545, 1236, 2090, 2614, 1949, 1307, 1628, 1780, 1263, 1184, 2184, 1411, 1306, 2010, 2057, 1339, 1624, 2480, 2575, 2425, 2617, 2479, 1929, 1805, 1869, 1341, 1104, 2195, 1661, 1174, 1447, 1761, 1362, 1430];
const peaks = [peaks1, peaks2];
function getPeaks(arr){
    let peaks = [];
    for(let i=0;i<arr.length;i++){
        let currPeak = arr[i].sort((a, b) => a - b).reverse().slice(0,1)[0];
        peaks.push(currPeak);
    }
    return peaks.sort((a, b) => a - b).reverse();
}
let result = getPeaks(peaks);
结果是:
[26172462]

24622456。。。?如果它们挨在一起,怎么可能是山峰呢?我看看能否在我的问题上附上一张图片。2462是9391301253的峰值,
1380, 1037, 2279, 2462, 2193. i、 e.两边的数字都比较低。2456来自2411、2456、2295,同样,它两边的数字都比它低,也就是说,它是一个峰值。您希望峰值的大小最小还是什么?2462将在图表上绘制为峰值,但2456是2462生成的峰值的一侧。你必须在每一个数字之间至少有一个数字才能形成一个峰值。你基本上有一个由数字1037、2279、2462、2193、2121、1424绘制的“山”。2462人在峰会上。这是我在上面对哈森的评论:鉴于你在问题中发布的图像,非峰值是清晰的,但你如何确定左侧峰值实际上是峰值而不是非峰值-这是你没有明确说明的部分。-你任意选择了2000年以上的任何一个峰值——这看起来像OP想要的,但仍然没有澄清。如果你想知道:@Randy Casburn我想也许“峰值”这个词让你感到困惑。最好把它想象成山。你不能看着3,5,6,2说3,5和6是山,因为它们肯定不会在图形上画出山的形状。你必须至少有三个数字才能造出一座山,因为它是一个三角形。例如1,3,1,形成一座山,其中3是它的顶峰。“或者1,3,5,4,2,1是一座山,其中5是它的顶峰。”哈森我给出的答案显示了每个三角形的尖端。然后你说三角形在计算之前必须有一定的大小,否则它们就是山。你能对你想要包含的内容给出一个更全面更具体的定义吗@哈森-不,这很容易。现在你明白了我们一直想告诉你的,请你回去编辑这个问题,以便将来对每个人都更清楚。StackOverflow是关于长期捕捉好问题的。这篇文章的质量和目前写的一样糟糕。好吧,你就是那个人。祝你过得愉快。祝你以后好运。评论不用于长时间的讨论;这段对话已经结束。
var arr = [1,6,4,3,9,11];

var peaks = arr.sort((a, b) => a - b).reverse();
var top5 = peaks.slice(0,5);
const peaks1 = [939, 1301, 253, 1380, 1037, 2279, 2462, 2193, 2121, 1424, 506, 2411, 2456, 2295, 915, 1276, 1532, 1359, 985, 2182, 2407, 2103, 2392, 2294, 765, 1195, 1537, 1409, 858, 1971, 2214, 1311, 1326, 1383, 1231, 1141];
const peaks2 =  [1365, 1324, 1013, 1220, 1259, 2204, 2212, 1938, 1882, 1545, 1236, 2090, 2614, 1949, 1307, 1628, 1780, 1263, 1184, 2184, 1411, 1306, 2010, 2057, 1339, 1624, 2480, 2575, 2425, 2617, 2479, 1929, 1805, 1869, 1341, 1104, 2195, 1661, 1174, 1447, 1761, 1362, 1430];
const peaks = [peaks1, peaks2];
function getPeaks(arr){
    let peaks = [];
    for(let i=0;i<arr.length;i++){
        let currPeak = arr[i].sort((a, b) => a - b).reverse().slice(0,1)[0];
        peaks.push(currPeak);
    }
    return peaks.sort((a, b) => a - b).reverse();
}
let result = getPeaks(peaks);