JavaScript数组中的唯一计数,按计数排序
我有一个JavaScript的名字列表。 我想要做的是获取唯一名称列表,但是对于该唯一名称列表,还会提供我原始列表中有多少个名称的计数。 此外,我需要按降序排列我的唯一名称的最终列表(如果某些计数相同,则按名称升序排列)。
这就是我所拥有的只是一个简单的字符串列表,然后给了我唯一名称列表。 从这里,我不确定在哪里获得计数或如何通过计数来对唯一列表进行排序。 我在想最终的结果将是一个二维数组的名称和数量或2个单独的数组,但我不知道如何去做这个最好和最有效的方法。
这是我到目前为止:
Array.prototype.contains = function(v) {
for (var i = 0; i < this.length; i++) {
if (this[i] === v) return true;
}
return false;
};
Array.prototype.unique = function() {
var arr = [];
for (var i = 0; i < this.length; i++) {
if (!arr.contains(this[i])) {
arr.push(this[i]);
}
}
return arr;
}
var uniqueAuthorNames = allAuthorNames.unique();
uniqueAuthorNames.sort();
使用散列图来计算唯一元素,然后按以下两个条件对唯一元素进行排序:
var names = ["eve", "carl", "adam", "carl"];
var counts = names.reduce((counts, name) => {
counts[name] = (counts[name] || 0) + 1;
return counts;
}, {});
var uniques = Object.keys(counts);
uniques.sort((a, b) => counts[a] == counts[b] ? a.localeCompare(b) : counts[b] - counts[a]);
console.log(counts);
console.log(uniques);
假设你的名字数组是在arr中:
var i;
var o = {};
var len = arr.length;
for (i=0; i<len; i++) {
o[arr[i]] = (o[arr[i]] || 0) + 1;
}
在这个阶段,o将持有每一个唯一的名字和数量。 然后,您可以按属性值排序JavaScript对象中的解决方案
这会是
var sortable = [];
for (var name in o) {
sortable.push([name, o[name]])
}
sortable.sort(function(a, b) {return b[1] - a[1]})
这应该适合你的需要。
Object.defineProperty (Array.prototype, 'getUniqueSorted', {
enumerable: false,
value: function () {
var uniqarr = [];
for (var i in this) {
var index = uniqarr.indexOf (this.[i]);
if (index == -1) {
uniqarr.push (this [i])
} else {
uniqarr [index].count = uniqarr.count ? 2 : uniqarr.count+1;
}
}
uniqarr = uniqarr.sort(function(a, b){
return (a.count | 1) - (b.count | 1)
});
return uniqarr;
}
});
还有其他一些选择可以让你更优雅。
Object.defineProperty (Array.prototype, 'removeDuplicated', {
enumerable: false,
value: function () {
var uniqarr = [];
this.reduce(function(accum, current) {
if (accum.indexOf(current) < 0) {
accum.push(current);
}
return accum;
}, uniqarr);
return uniqarr.sort(function(a, b){
return a.count - b.count
});
}
});
链接地址: http://www.djcxy.com/p/19047.html