Javascript 重复数据消除阵列和按最频繁出现的阵列排序(使用LoDash)

Javascript 重复数据消除阵列和按最频繁出现的阵列排序(使用LoDash),javascript,arrays,sorting,collections,lodash,Javascript,Arrays,Sorting,Collections,Lodash,假设我有一个数组,它类似于: fruit_basket = ['apple', 'orange', 'banana', 'pear', 'banana'] 我想制作一个数组水果,它包含在果篮中找到的水果,按最常出现的水果的顺序排序。(如果有领带,我不在乎订购。) 因此,水果的一个有效值是: ['banana', 'orange', 'apple', 'pear'] 使用LoDash实现这一点最简洁的方法是什么?我不关心运行时性能 首先你要计算发生的次数 var x = _.chain(fr

假设我有一个数组,它类似于:

fruit_basket = ['apple', 'orange', 'banana', 'pear', 'banana']
我想制作一个数组
水果
,它包含在
果篮
中找到的水果,按最常出现的水果的顺序排序。(如果有领带,我不在乎订购。)

因此,
水果的一个有效值是:

['banana', 'orange', 'apple', 'pear'] 

使用LoDash实现这一点最简洁的方法是什么?我不关心运行时性能

首先你要计算发生的次数

var x = _.chain(fruit_basket).countBy(); // {apple: 1, orange: 1, banana: 2, pear: 1}
然后将它们配对并按出现次数排序,使用
reverse
首先获得最大的数字

var y = x.toPairs().sortBy(1).reverse(); //[["banana",2],["pear",1],["orange",1],["apple",1]]
然后您只需映射回键,并以数组的形式获取值

var arr = y.map(0).value(); // ['banana', 'orange', 'apple', 'pear'] 
所有的东西都锁在一起,看起来像

var arr = _.chain(fruit_basket).countBy().toPairs().sortBy(1).reverse().map(0).value();

如果没有loDash,像这样的东西就可以了

var fruit_basket = ['apple', 'orange', 'banana', 'pear', 'banana'];

var o = {};
fruit_basket.forEach(function(item) {
    item in o ? o[item] += 1 : o[item] = 1;
});
var arr = Object.keys(o).sort(function(a, b) {
    return o[a] < o[b];
});
var fruit_basket=[“苹果”、“橘子”、“香蕉”、“梨”、“香蕉”];
var o={};
果篮(功能(项目){
o中的项目?o[项目]+=1:o[项目]=1;
});
var arr=Object.keys(o).sort(函数(a,b){
返回o[a]
一种使用
的方法,用于
循环
Array.prototype.splice()

var fruit_basket=[“苹果”、“橘子”、“香蕉”、“梨”、“香蕉”];
var-res=[];
对于(变量i=0;i<果篮长度;i++){
var指数=res.indexOf(果篮[i]);
//如果当前项在`res'中不存在`
//将当前项目推送到'res'`
如果(索引==-1){
res.push(果篮[i])
}否则{
//若要删除当前项,请将当前项设置为`res`的索引`0``
res.拼接(索引,1);
res.拼接(0,0,果篮[i])
}
}

console.log(res)
您可以使用u.countBy统计发生次数,然后在u.sortBy中使用它:

var counter = _.countBy(fruit_basket)
var result  = _(fruit_basket).uniq().sortBy(fruit => counter[fruit]).reverse().value()

这是我的看法

它没有像问题要求的那样使用lodash。这是香草的替代品。我觉得这对那些从谷歌登陆而不想使用lodash的人来说是很有价值的(至少我是这样来到这里的)


js
解决方案是一个选项吗?@guest271314如果它比lodash解决方案更简洁,那么我不明白为什么不。通过将
1
传递给
sortBy
,是不是说按数组索引
1
处的值排序?(我看不到文档中提到的缩写)是的,语法是
.sortBy(list,iteratee,[context])
,但是当它链接起来时,列表被传递为
this
,iteratee是第一个参数,这里是
1
,意思是内部数组中的
arr[1]
,您测试过lo-dash解决方案吗?我认为它在最新版本中不起作用。我很确定您需要将
交换为
toPairs
,当我试图将索引传递到
sortBy()
时,它没有正常工作…@LukeP-我在只支持LoDash 2.2.1的JSFIDLE中测试了它。更新了答案以使用版本4中提供的新方法+
const orderByCountAndDedupe = arr => {
    const counts = new Map();

    arr.forEach( item => {
        if ( !counts.has(item) ) {
            counts.set(item, 1);
        } else {
            counts.set(item, counts.get(item)+1);
        }
    });

    return (
        Array.from(counts)
            .sort( (a, b) => b[1] - a[1])
            .map( ([originalItem, count]) => originalItem)
    );
 };