Javascript 我想对数组的元素进行排序
假设我有如下数组Javascript 我想对数组的元素进行排序,javascript,node.js,Javascript,Node.js,假设我有如下数组 var array=[3,4,5,5,5,6,8,3,12,1,1,1]; 那么结果应该是 array=[5,1,3,4,6,8,12]; 在JavaScript或nodejs中需要实现以下一种方法: JSBIN: var数组=[3,4,5,5,6,8,3,12,1,1,1]; var c=array.reduce(函数(a,b){ a[b]=++a[b]| 1; 返回a; }, {}); var keys=Object.keys(c); var nn=keys.sort(
var array=[3,4,5,5,5,6,8,3,12,1,1,1];
那么结果应该是
array=[5,1,3,4,6,8,12];
在JavaScript或nodejs中需要实现以下一种方法:
JSBIN:
var数组=[3,4,5,5,6,8,3,12,1,1,1];
var c=array.reduce(函数(a,b){
a[b]=++a[b]| 1;
返回a;
}, {});
var keys=Object.keys(c);
var nn=keys.sort(函数(a,b){
if(c[a]
我在这篇文章中结合使用了和普通JavaScript数组方法:
但是,“5”
和“1”
的顺序与3,4,6,8,12
的顺序不同,因为没有为具有相同计数的数字指定排序顺序
上面所做的是创建一个number=>count
(例如{“1”:3,“5”:3}
)的映射,然后将它们作为元组进行配对(因为对象在JavaScript中无法确定排序:[[[“1”,3],“5”,3]
)。然后,我们只需根据计数对元组集合进行排序,并映射元组集合以仅返回数字(例如,[“1”,“5”,“/*等。*/]
)。函数sortArray(数组){
var reducedArray=array.filter(函数(项,位置){//一个没有重复项的副本
返回数组。indexOf(item)==pos;
})
var elementFreq={}//包含元素频率的对象
对于(var i=0;i
var数组=[3,4,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]}))
.排序((a,b)=>b.次-a.次)
.map(e=>e.n);
文件写入(已排序)
请告诉我您遇到的问题。所以不要为您编写代码。这是可以理解的代码,但效率不高。您肯定不希望每次比较两个项目时都在整个数组中运行。@Harangue您是对的,谢谢您的反馈。我编辑代码是为了在c之前存储元素频率默哀。
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)});
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"]
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
}