数组查找统计

var a = [ 'ping','ewewe','w','js','windvane' ,'ping'];

如何把数组出现大于一次的item提取出来,并注明它出现的次数

阅读 2.4k
3 个回答

clipboard.png

返回的数组中,count为出现的次数,el代表元素。代码在下面,我之前也有写过这样的文章,你可以参考下。
编写自己的代码库(javascript常用实例的实现与封装)

//arr, rank->长度,默认为数组长度,ranktype,排序方式,默认降序
function getCount(arr, rank,ranktype){ 
    var obj = {}, k, arr1 = []
    //记录每一元素出现的次数
    for (var i = 0, len = arr.length; i < len; i++) {
        k = arr[i];
        if (obj[k]) {
            obj[k]++;
        }
        else {
            obj[k] = 1;
        }
    }
    //保存结果{el-'元素',count-出现次数}
    for (var o in obj) {
        arr1.push({el: o, count: obj[o]});
    }
    //排序(降序)
    arr1.sort(function (n1, n2) {
        return n2.count - n1.count
    });
    //如果ranktype为1,则为升序,反转数组
    if(ranktype===1){
        arr1=arr1.reverse();
    }
    var rank1 = rank || arr1.length;
    return arr1.slice(0,rank1);
}
// 你要的应该是这个json
var a = [ 'ping','ewewe','w','js','windvane' ,'ping', 'js','windvane' ,'ping'];
var obj = {};
var json = {};
for (let i = 0, len = a.length; i < len; i++) {
    if (obj[a[i]]) {
        obj[a[i]] += 1
        json[a[i]] = obj[a[i]]
    } else {
        obj[a[i]] = 1
    }
}
console.log(obj, json)

clipboard.png

供参考

var a = [ 'ping','ewewe','w','js','windvane' ,'ping']

var result = a.reduce((map, item) => map.set(item, (map.get(item) || 0) + 1), new Map())

Array.from(result) // [["ping",2],["ewewe",1],["w",1],["js",1],["windvane",1]]
Array.from(result.keys()) // [ 'ping', 'ewewe', 'w', 'js', 'windvane' ]

// 去掉一个的
Array.from(result).filter(item => item[1] > 1) // [ [ 'ping', 2 ] ]
推荐问题