【问题标题】:How to edit the highest 5 values of an array in javascript?如何在javascript中编辑数组的最高5个值?
【发布时间】:2020-10-12 12:22:51
【问题描述】:

我有一个存储一系列分数的一维数组。我的最终目标是获得 5 个最高分,并用括号括起来(例如 (score) ),然后我可以格式化并输出到显示器上。在有重复分数的情况下,第一次出现的值将被括起来,最多为前 5 个值。

例如: [9,8,10,9,6,8,6,5,4,4,3,3,6] 将变为 [(9),(8),(10),(9),6,(8 ),6,5,4,4,8,3,8]

到目前为止我尝试过的是:

var topvals = scores.sort((a,b) => b-a).slice(0,5);
    for(var j=0; j< scores.length; j++){
      if(topvals.length==0){
        break;
      }else if(topvals.includes(scores[j])){
        scores[j] = "(" + scores[j] + ")";
        topvals.splice(topvals.indexOf(scores[j]),1);
      }
    }

考虑到 topvals 是一个包含前 5 个值的数组,然后我循环遍历分数以查找这些值,每次都将它们删除。

这会导致前 5 个分数的值被括号括起来。

我很高兴为此走一条完全不同的路线,或者只是修复我到目前为止所做的事情。提前致谢。

【问题讨论】:

  • 只是克隆分数。 scoreclone = score.slice()
  • 这能回答你的问题吗? Keep original array after JavaScript function
  • 很遗憾没有。该帖子仅涉及编辑您知道值在哪里的数组。我遇到的问题是帖子中描述的内容。
  • 在你的例子中dvals应该是topvals吗?您还可以解释您遇到的错误/意外行为吗?
  • 这需要多高效?最简单的方法是 scores.map((n,i)=&gt;({n,i})).sort((a,b)=&gt;b.n-a.n).slice(0,5).map(({i})=&gt;i).forEach(i=&gt;scores[i]=`(${scores[i]})`)。如果大型数据集需要 O(N),则可以使用数据透视算法。

标签: javascript arrays


【解决方案1】:

使用附加的索引进行排序。使用索引位置更改为所需的格式。 O(N log N) 的排序。

scores = [9,8,10,9,6,8,6,5,4,4,3,3,6]
scores.map((n,i)=>({n,i})) // each object as n: number, i: index
  .sort((a,b)=>a.n-b.n).slice(-5) // sort, slice top 5
  .forEach(({i})=>scores[i]=`(${scores[i]})`) // add parens by indexes

console.log(scores)

如果您有非常非常大的数据集并且需要更接近 O(N) 的数据,您将需要实现一个枢轴选择算法。只是排序更简单。

【讨论】:

  • 谢谢,使用附加索引进行排序应该可以解决这个问题。一段时间以来,我一直把头撞在一个特定方向的墙上,所以看不到其他路线!
【解决方案2】:

sort() 的调用将scores 就地排序,这意味着它会更改scores 数组。所以这就是为什么你需要先克隆它,然后排序,然后切片。此外,您可能希望从分数中消除重复项。我链接了一个堆栈溢出答案,描述了如何做到这一点。由于 filter 不会就地过滤scores,而是返回一个新数组,因此您无需显式调用slice(0) 来克隆scores

var scores = [9,8,10,9,6,8,6,5,4,4,3,3,6];

// Function from linked SO answer.
function onlyUnique(value, index, self) { 
    return self.indexOf(value) === index;
}

// Filter unique scores into copy of array, then slice the top 5.
var topvals = scores.filter(onlyUnique).sort((a,b) => b-a).slice(0,5);

for (var j=0; j< scores.length; j++) {
   if( topvals.length==0) {
        break;
   } else if(topvals.includes(scores[j])) {
        scores[j] = "(" + scores[j] + ")";
        topvals.splice(topvals.indexOf(scores[j]),1);
   }
}

Get all unique values in a JavaScript array (remove duplicates)

【讨论】:

  • 这个问题是我需要保留副本。这个问题源于一个更大的项目的最后,我只需要在输出之前进行一些格式化,所以数据需要保持原样。
猜你喜欢
  • 1970-01-01
  • 2021-01-27
  • 2018-01-01
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
  • 2017-03-04
相关资源
最近更新 更多