2 回答

TA貢獻1829條經驗 獲得超7個贊
附加索引進行排序。使用索引位置更改為所需的格式。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) 的數據,您將需要實現一個樞軸選擇算法。只是排序更簡單。

TA貢獻1818條經驗 獲得超11個贊
調用sort()排序scores就地,這意味著它改變了scores數組。所以這就是為什么你需要先克隆它,然后排序,然后切片。此外,您可能希望從分數中消除重復項。我鏈接了一個堆棧溢出答案,描述了如何做到這一點。由于 filter 不會scores就地過濾,而是返回一個新數組,因此您無需顯式調用slice(0)clone 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);
}
}
添加回答
舉報