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

上一篇: Unique counts in JavaScript array, sorted by counts

下一篇: "dot function" operator in JavaScript