Javascript 如何减少具有相似值的数字数组

Javascript 如何减少具有相似值的数字数组,javascript,arrays,Javascript,Arrays,我想创建一个方法,它接受一个数字列表,并可以通过提供的方差减少数组 解释的差异: 方差应与低于或高于的值相匹配。例如,100的方差等于5460的值,应该匹配5410-5510之间的任何值。低于相等值50,高于相等值50 例如,如果我有数组: [ 1576420754, 1576420756, 1576593554, 1581172759, 1581172764 ] 我想创建一个方法filterMilarValuesArray,方差=100 这将为我提供以下输出: [ 1576420756, 1

我想创建一个方法,它接受一个数字列表,并可以通过提供的方差减少数组

解释的差异:

方差应与低于或高于的值相匹配。例如,100的方差等于5460的值,应该匹配5410-5510之间的任何值。低于相等值50,高于相等值50

例如,如果我有数组:

[ 1576420754, 1576420756, 1576593554, 1581172759, 1581172764 ]
我想创建一个方法filterMilarValuesArray,方差=100

这将为我提供以下输出:

[ 1576420756, 1576593554, 1581172764 ]
我试过两种方法,比如

const filterSimalarValues = (array, variance = 100) => {
    let filteredArray = [];

    for (let i = 0; i < array.length; i++) {
        const number = array[i];

        if (number >= number - (variance / 2) && number <= number + (variance / 2)) {
            return;
        }

        filteredArray.push(number);
    }

    return filteredArray;
};

我想尝试一下:

const filterSimalarValues = (array, variance = 100) =>
  array.reduce((acc, curr) => {
    const variant = acc.find(
      item => curr > item - variance / 2 && curr < item + variance / 2,
    );
    if (!variant) {
      acc.push(curr);
    } else {
      acc[acc.indexOf(variant)] = curr;
    }
    return acc;
  }, []);

此外,我认为您的问题应该更具体,有许多可能的边缘情况没有涵盖。

根据提供的解释和我对差异的理解,您希望将数字限制在差异范围内。我假设您至少有2个元素,但您可以为该情况添加检查

常数filterSimalarValues=数组,方差=100=>{ 常量过滤器阵列=[]; filteredArray.pusharray[0];//要检查的基准点 对于let i=1;iforvar bound=number\u lower\u bound;bound这是我提出的,它是有效的,但可能有更好的解决方案,所以我不接受自己的答案

const filterSimilarValues = (array, variance = 100) => {
  let filteredArray = [];

  array.forEach(number => {
    const start = number - (variance / 2);
    const end = number + (variance / 2);
    const range = Array(end - start + 1).fill().map((_, idx) => start + idx);
    const found = range.some(r => filteredArray.includes(r))

    if (!found) {
      filteredArray.push(number);
    }
  });

  return filteredArray;
};
使用Array.filter仅保留它们与下一个数字之间的绝对差Math.abs大于或等于方差/2的数字。默认情况下,最后一项i===Array.length-1

常数filterSimalarValues=数组,方差=100=> array.filtern,i=> i==array.length-1|| Math.absn-数组[i+1]>=方差/2 常量数据=[1576420754、1576420756、157659354、158172759、158172764] const result=FiltersMalarValuesData
console.logresultplease分享您是如何尝试解决此问题的?您的问题是什么?这是一个算法问题,您的方差应该如何工作?当您有值:[10,12,13,14,15,16]和方差为5时,输出应该是什么?[10,16]或例如[13]?原始数组中的前两个值仅相差2 1576420754、1576420756,后两个值相差5 1581172759、1581172764,因此我只想为这些相似的值设置一个值。就像将它们视为重复值一样。您可能需要[10,16],但为什么,原因是什么,这样就可以为任何数组复制它?我已经更新了最后一项I===array.length-1的处理,因为如果数组[I+1]| |无穷大为0,则使用数组[I+1]会给出错误的结果。