js数组,去重并筛选按类别并根据数值大小排序

output数组去重排序筛选

// 需要实现的代码
// 1. 如果 id 重复,去除 level 值小的一项
// 2. 属性 acitive 为 true 的项目排行靠前
// 3. 属性 acitive 相同时,level 高的靠前
// 4. 返回项目格式为 名称-等级 的字符串
// return ...

题目来源及自己的思路

我的思路就是使用ForEach去重如何使用filter筛选。。。。然后就不会了,刚进入js就给我一个大乱炖求大神解析!!!!!

相关代码

// 下列是题目自带条件
const Stacks = [{

 id: 1,
 name: 'JavaScript',
 level: 1,
 active: true
 },{
 id: 2,
 name: 'CSS',
 level: 3,
 active: false
 },{
 id: 3,
 name: 'HTML',
 level: 2,
 active: true
 },{
 id: 1,
 name: 'JavaScript',
 level: 4,
 active: true
 },{
 id: 4,
 name: 'JQuery',
 level: 1,
 active: false

}]
function output2(Arr){
}
output2(Stacks);
// 结果返回
// ['JavaScript-4','HTML-2','CSS-3','JQuery-1'];

你期待的结果是什么?实际看到的错误信息又是什么?

阅读 3k
3 个回答
let result = Stacks
  .filter(a => !Stacks.some(b => a !== b && a.id === b.id && b.level > a.level))
  .sort((a, b) => a.active > b.active ? -1 : (a.active < b.active ? 1 : b.level - a.level))
  .map(a => `${a.name}-${a.level}`);

console.log(result);
function merge(arr){
 var cache=[],newArr=[];
 for(var i=0;i<arr.length;i++){ //去重
   var id = arr[i].id,
       idx = cache.indexOf(id);
   idx==-1?(cache.push(id),newArr.push(arr[i])):
    (newArr[idx].level<arr[i].level&&(newArr.splice(idx,1),newArr.push(arr[i])));
 }
 return newArr.sort(function(a,b){ //排序
   return a.active?-1:(a.level>b.level?-1:1)
 });
}
merge(Stacks);
Stacks.sort((a,b)=>{
    if(a.active>b.active){
        return -1
    }else if(a.active==b.active){
        return b.level-a.level
    }else{
        return 1
    }
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏