我正在使用 javascript 陣列計算在序列中找到的 0 到 256 之間的數字的頻率。
如果我看到數字 74 彈出,我將其存盤在第 74 個索引值中(即 mysequence[74] = mysequence[74] 1)
我可以看到結果統計,并且在視覺上掃描它時很容易看到某些數字(例如 65)比其他數字出現得更多。我想找出出現頻率最高的 10 個數字。
我擔心一個簡單的排序不會保留我用來跟蹤與計數頻率相關聯的數字的索引值。
想到的唯一想法是蠻力方法。創建一個函式以逐個查看所有值,保持最高值并忽略屬于忽略串列的所有索引。然后運行該函式 10 次,隨后每次傳遞已分配最高值的索引的值。
有沒有辦法在不采用上述方法的情況下獲取與前 10 個值關聯的數字鍵?(即也許將我的資料轉換為不同的格式和一些花哨的地圖排序功能?)
uj5u.com熱心網友回復:
您可以獲取索引并使用這些值對它們進行排序并獲得最想要的索引。
const
values = [7, 3, 4, 5, 2, 8],
indices = [...values.keys()].sort((a, b) => values[b] - values[a]);
console.log(indices.slice(0, 3));
uj5u.com熱心網友回復:
如果您只是立即對其進行排序,那么您肯定會丟失有關索引的資訊。您可以做的是將帶有值的陣列映射到帶有索引和值的陣列(這樣您以后就不會丟失資訊),然后對它進行排序,但是您更改排序方法的標準以獲得具有最高值的索引。
const arr = [2, 1, 0, 3];
const getTopN = (arr, n = 10) => {
const _arr = arr.map((value, index) => [value, index]);
// by using b[0] - a[0] instead of a[0] - b[0] we can get the array in non-increasing order
_arr.sort((a, b) => b[0] - a[0])
return _arr.slice(0, n).map(([_, index]) => index);
}
console.log(getTopN(arr))
該getTopN功能完成作業。
uj5u.com熱心網友回復:
可能還有其他方法,但我想到的是將原始陣列映射到一組值/索引對,根據值對結果進行排序,然后獲取最后(或第一個)10 項排序后的陣列(取決于您是否進行了升序或降序排序)。
yourArray.map((value, index) => ({ value, index }))
.sort((a, b) => b.value - a.value)
.slice(0, 10)
.map(obj => obj.index);
map如果您想在結果中同時保留索引和與它們相關的值,則可以省略最后一個。
uj5u.com熱心網友回復:
我會稍微不同地存盤這些值(或添加一個步驟,在哪里):它們像[number, numberOfAppearances].
然后很容易對它們進行排序并獲得前 10 個。
const randomIntFromInterval = (min, max) => {
return () => Math.floor(Math.random() * (max - min 1) min)
}
const generateRndNum = randomIntFromInterval(0, 100)
const numArr = Array(1000).fill(0).map(_ => generateRndNum())
const tally = numArr.reduce((a, c) => {
if (typeof a[c] === "undefined") a[c] = [c, 0]
a[c][1] = 1
return a
}, [])
const sorted = [...tally].sort(([k1, v1], [k2, v2]) => v2 - v1)
// getting the first ten:
sorted.length = 10
console.log(sorted)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/419146.html
標籤:
上一篇:如何從陣列物件中洗掉元素
