0

我有一系列项目。例如:

var classes = ['link', 'block', 'hide', 'link', 'menu', 'block', 'content', 'link', 'footer', 'img', 'img', 'link', 'modal', 'button', 'form', 'input', 'button', 'input', 'link', 'toString', 'valueOf', 'button'];

我需要得到一组独特的项目,按频率排序:

'link'item 应该放在第一位,因为数组包含它 5 次。

'button'item 应该排在第二位,因为数组包含它 3 次。

ETC

["link", "button", "input", "img", "block", "footer", "content", "modal", "menu", "form", "hide", "toString", "valueOf"]
4

6 回答 6

2

您可以使用 ECMAScript 5 方法轻松获得它:

var classes = ['link', 'block', 'hide', 'link', 'menu', 'block', 'content', 'link', 'footer', 'img', 'img', 'link', 'modal', 'button', 'form', 'input', 'button', 'input', 'link', 'toString', 'valueOf', 'button'];

var frequency = classes.reduce(function(data, item) {
    data[item] = -~data[item];
    return data;
}, {});

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

console.log(uniques);

如果您必须支持旧浏览器,您仍然可以使用shims

于 2013-04-06T11:35:07.757 回答
1

两步:

  1. {'item', 'frequency'}将您的数据排列在一对数组中
  2. 使用array.sort函数:

    var arr = [{'item':'link', 'freq':4},{'item':'button', 'freq':2},{'item':'div', 'freq':5}];
    
    arr.sort(function(a,b){return b.freq - a.freq});
    
于 2013-04-06T10:44:44.633 回答
1

Underscore.js解决方案:

var dict = _.reduce(classes, function(memo, class) {
    memo[class] = memo[class] ? memo[class] + 1 : 1
}, {});

var pairs = _.pairs(dict);

var sortedPairs = _.sort(pairs, function(pair) {
    return pair[1];
});

var result = _.map(sortedPairs, function(pair) {
    return pair[0];
});
于 2013-04-06T10:51:24.063 回答
1

它应该是这样的。

        var classes = [ 'link', 'block', 'hide',
                    'link', 'menu', 'block',
                    'content', 'link', 'footer',
                    'img', 'img', 'link', 'modal',
                    'button', 'form', 'input',
                    'button', 'input', 'link',
                    'toString', 'valueOf', 'button'];
    var counter;
    var i=0,z=0,x=0;
    var bool = false;
    while(!bool){
        for(j=1;j<classes.length;j++)
        {
            if(( classes[i] == -1) || (classes[j] == -1))
            {
                i++;j++;
            }
            else if(classes[i] === classes[j])
            {
                classes[j] = -1;
                counter = z + "," + (Number(x)+1);
            }
            x++;
        }
        i++;
        z++;
        if((classes.length-1) == i)
        {
            bool = true;
        }
    }

在 End 计数计数器中的第二个变量 (z , "x") 所以在每个
实例 Z 出现将是 x

于 2013-04-06T11:10:56.780 回答
1

试试这个

var xArray= ["apple","cake","pie","pie","pie","apple"];
var xNew=[];
var temp;

for(var i=0;i<=xArray.length-1;i++)
{
   if( xNew.indexOf(xArray[i]) === -1 )
   {
   xNew.push(xArray[i])    
   }
}

function occuranceOf(xStr)
{
    var xCount =0;
    for(var i=0; i<=xArray.length-1; i++)
    {
        if(xArray[i] === xStr)
            {
        xCount += 1;        
            }                 
    }

    return xCount;
}

for(var i=0;i<=xNew.length-1;i++)
{
    for(var j=i+1; j<=xNew.length-1; j++)
    {
        if(occuranceOf(xNew[i]) < occuranceOf(xNew[j]))
        {
            temp = xNew[i];
            xNew[i] = xNew[j];
            xNew[j] = temp;
        }
    }
}

alert(xNew);
于 2013-04-06T11:14:53.600 回答
1

怎么样:

var classes = ['link', 'block', 'hide', 'link', 'menu', 'block', 'content', 'link', 'footer', 'img', 'img', 'link', 'modal', 'button', 'form', 'input', 'button', 'input', 'link', 'toString', 'valueOf', 'button'],
    frequency = {},
    sortedClasses = [],
    result = [];

for (var i in classes) {
    var name = 'z' + classes[i];
    frequency[name] = frequency[name] ? frequency[name] + 1 : 1;
}

for (var j in frequency) {
    sortedClasses.push([j, frequency[j]]); 
}

sortedClasses.sort(function (a, b) {
    return b[1] - a[1]; 
});

for (var g in sortedClasses) {
    var name = sortedClasses[g][0].substr(1);
    result.push(name);
}

我在类前面加上“z”,因为它们的名字,例如。“的价值”

于 2013-04-06T11:15:35.443 回答