4 回答

TA貢獻1793條經驗 獲得超6個贊
我在這個jsbin示例中使用了lodash和普通JavaScript數組方法的組合:
var arr = [3,4,5,5,5,6,8,3,12,1,1,1];var sorted = _.sortBy(_.toPairs(arr.reduce(function(agg, curr) { agg[curr] = agg[curr] ? agg[curr] + 1 : 1; return agg;}, {})), function(pair) { return -pair[1];}).map(function(pair) { return pair[0];});console.log(sorted); // => ["1", "5", "3", "4", "6", "8", "12"]
但是,排序順序"5"
和順序"1"
不同3,4,6,8,12
,因為沒有為具有相同計數的數字指定排序順序。
上面所做的是創建number=>count
(例如{ "1": 3, "5": 3 }
)的映射,然后將它們配對為元組(因為對象不能在JavaScript中確定性地排序:) [["1", 3], ["5", 3]]
。然后,我們簡單地根據計數對元組集合進行排序,并映射元組集合以僅返回數字(例如["1", "5", /* etc. */ ]
)。

TA貢獻1829條經驗 獲得超6個贊
var array = [3, 4, 5, 5, 5, 6, 8, 3, 12, 1, 1, 1];var obj = {};array.forEach(e => obj[e] = obj[e] + 1 || 1);var sorted = Object.keys(obj) .map(e => ({ n: e, times: obj[e] })) .sort((a, b) => b.times - a.times) .map(e => e.n);document.write(sorted);

TA貢獻2039條經驗 獲得超8個贊
function sortArray(array) {
var reducedArray = array.filter(function(item, pos) { //A copy without duplicates
return array.indexOf(item) == pos;
})
var elementFreq = {} //Object that contains element frequencies
for (var i=0; i<reducedArray.length; i++) {
var count = 0;
for (var j=0; j<array.length; j++) {
if (array[j] == reducedArray[i]) {
count++;
}
}
elementFreq[array[i]] = count;
}
function compare(a,b) { //compares the frequency of two elements
return elementFreq[b]-elementFreq[a]
}
reducedArray.sort(compare) //sorts reducedArray based using compare function
return reducedArray
}
添加回答
舉報