按Javascript数组中的出现次数(计数)排序

Cho*_*pra 4 javascript arrays sorting jquery

我是Jquery和Javascript的新手.有人可以根据数组中的出现次数(计数)帮助我进行Jquery排序.我尝试了各种排序方法,但没有一种方法有效.

我在Javascript中有一个数组

allTypesArray = ["4", "4","2", "2", "2", "6", "2", "6", "6"]

// here  2 is printed four times, 6 is printed thrice, and 4 is printed twice
Run Code Online (Sandbox Code Playgroud)

我需要像这样的输出

newTypesArray = ["2","6","4"]
Run Code Online (Sandbox Code Playgroud)

我试过了

function array_count_values(e) {
var t = {}, n = "",
    r = "";
var i = function (e) {
    var t = typeof e;
    t = t.toLowerCase();
    if (t === "object") {
        t = "array"
    }
    return t
};
var s = function (e) {
    switch (typeof e) {
    case "number":
        if (Math.floor(e) !== e) {
            return
        };
    case "string":
        if (e in this && this.hasOwnProperty(e)) {
            ++this[e]
        } else {
            this[e] = 1
        }
    }
};
r = i(e);
if (r === "array") {
    for (n in e) {
        if (e.hasOwnProperty(n)) {
            s.call(t, e[n])
        }
    }
}
return t
}
6: 3
}
Run Code Online (Sandbox Code Playgroud)

输出是 {4: 2, 2: 6, 6:3}

Den*_*ret 6

我不认为在一个步骤中有直接的解决方案,当然它不仅仅是一种排序(一种不会删除元素).一种方法是构建一个对象的中间映射来存储计数:

var allTypesArray = ["4", "4","2", "2", "2", "6", "2", "6", "6"];
var s = allTypesArray.reduce(function(m,v){
  m[v] = (m[v]||0)+1; return m;
}, {}); // builds {2: 4, 4: 2, 6: 3} 
var a = [];
for (k in s) a.push({k:k,n:s[k]});
// now we have [{"k":"2","n":4},{"k":"4","n":2},{"k":"6","n":3}] 
a.sort(function(a,b){ return b.n-a.n });
a = a.map(function(a) { return a.k });
Run Code Online (Sandbox Code Playgroud)

请注意,这里不需要jQuery.当你不操纵DOM时,你很少需要它.


Gab*_*oli 6

只是添加我的想法(有点太晚了

var allTypesArray = ["4", "4", "2", "2", "2", "6", "2", "6", "6"];
var map = allTypesArray.reduce(function(p, c) {
  p[c] = (p[c] || 0) + 1;
  return p;
}, {});

var newTypesArray = Object.keys(map).sort(function(a, b) {
  return map[b] - map[a];
});

console.log(newTypesArray)
Run Code Online (Sandbox Code Playgroud)