我想对数组的元素进行排序[关闭]
Posted
技术标签:
【中文标题】我想对数组的元素进行排序[关闭]【英文标题】:I want to sort the element of array [closed] 【发布时间】:2016-07-26 01:30:47 【问题描述】:假设我有如下数组
var array=[3,4,5,5,5,6,8,3,12,1,1,1];
那么结果应该是
array=[5,1,3,4,6,8,12];
javascript 或 nodejs 中的必需实现
【问题讨论】:
请add the code you've written 以及您遇到的问题。 SO 不会为您编写代码。 【参考方案1】: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
【讨论】:
这是可以理解的代码,但不必要地低效。您肯定不想每次比较两个项目时都遍历整个数组。 @Harangue 你说得对,感谢您的反馈。在比较之前,我编辑了代码以存储元素频率。【参考方案2】: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);
【讨论】:
【参考方案3】:我在这个jsbin example 中使用了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. */ ]
)。
【讨论】:
【参考方案4】:这是一种方法: JSBIN:https://jsbin.com/josuwir/1/edit?js,console
var array=[3,4,5,5,5,6,8,3,12,1,1,1];
var c = array.reduce(function(a, b)
a[b] = ++a[b] || 1;
return a;
, );
var keys = Object.keys(c);
var nn = keys.sort(function(a, b)
if (c[a] < c[b])
return 1;
else
return -1;
).map(function(a) return Number(a));
【讨论】:
以上是关于我想对数组的元素进行排序[关闭]的主要内容,如果未能解决你的问题,请参考以下文章