Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据Javascript和ES6中出现的情况对对象数组进行排序_Javascript_Arrays_Ecmascript 6_Javascript Objects - Fatal编程技术网

根据Javascript和ES6中出现的情况对对象数组进行排序

根据Javascript和ES6中出现的情况对对象数组进行排序,javascript,arrays,ecmascript-6,javascript-objects,Javascript,Arrays,Ecmascript 6,Javascript Objects,具有以下属性的对象数组 [ { testerId: '1',name:'Kaka'}, { testerId: '3',name:'Messi'}, { testerId: '3',name:'Messi'}, // 1 = 3 times (Kaka) { testerId: '3',name:'Messi'}, // 2 = 5 times (Ramos) { testerId: '3',name:'Messi'}, // 3 = 4 times (Messi)

具有以下属性的对象数组

[ 
  { testerId: '1',name:'Kaka'},
  { testerId: '3',name:'Messi'},
  { testerId: '3',name:'Messi'},  // 1 = 3 times (Kaka)
  { testerId: '3',name:'Messi'},  // 2 = 5 times (Ramos)
  { testerId: '3',name:'Messi'},  // 3 = 4 times (Messi)
  { testerId: '2',name:'Ramos'},  // 4 = 2 times (Neuer)
  { testerId: '2',name:'Ramos'},  // 5 = 6 times (Ronaldo)
  { testerId: '1',name:'Kaka'},
  { testerId: '5',name:'Ronaldo'},
  { testerId: '5',name:'Ronaldo'},
  { testerId: '5',name:'Ronaldo'},
  { testerId: '5',name:'Ronaldo'},
  { testerId: '5',name:'Ronaldo'},
  { testerId: '4',name:'Neuer'},
  { testerId: '4',name:'Neuer'},
  { testerId: '1',name:'Kaka'},
  { testerId: '2',name:'Ramos'},
  { testerId: '2',name:'Ramos'},
  { testerId: '2',name:'Ramos'},
  { testerId: '5',name:'Ronaldo'},
]
输出:[
罗纳尔多
拉莫斯
梅西
卡卡
纽尔
]


它应该是按
testerId
的出现顺序递增的

内置javascript
.sort
方法在这里会很有帮助。您可以根据对象中的名称计数向其传递一个比较器

因此,首先创建一个名称到出现次数的映射,然后创建一个仅包含名称本身的数组。那么分类就相当简单了:

const myArray=[
{testerId:'1',name:'Kaka'},
{testerId:'3',name:'mesi'},
{testerId:'3',name:'mesi'},//1=3次(卡卡)
{testerId:'3',name:'mesi'},//2=5次(拉莫斯)
{testerId:'3',name:'mesi'},//3=4次(mesi)
{testerId:'2',name:'Ramos'},//4=2次(Neuer)
{testerId:'2',name:'Ramos'},//5=6次(罗纳尔多)
{testerId:'1',name:'Kaka'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'4',name:'Neuer'},
{testerId:'4',name:'Neuer'},
{testerId:'1',name:'Kaka'},
{testerId:'2',name:'Ramos'},
{testerId:'2',name:'Ramos'},
{testerId:'2',name:'Ramos'},
{testerId:'5',姓名:'Ronaldo'},
]
常量myArrayCounts=myArray.reduce((计数,项目)=>{
如果(计数[项目名称]==未定义)计数[项目名称]=0;
计数[项目名称]++;
返回计数;
}, {});
常量myArrayNames=myArray
.map(x=>x.name)
.filter((x,i,l)=>l.indexOf(x)==i);//花式重复数据消除过滤器

console.log(myArrayNames.sort((v1,v2)=>{return myArrayCounts[v2]-myArrayCounts[v1]}))
您可以使用
set
对象和计数器对象跟踪条目。然后简单地按返回的计数排序

让arr=[
{testerId:'1',name:'Kaka'},
{testerId:'3',name:'mesi'},
{testerId:'3',name:'mesi'},//1=3次(卡卡)
{testerId:'3',name:'mesi'},//2=5次(拉莫斯)
{testerId:'3',name:'mesi'},//3=4次(mesi)
{testerId:'2',name:'Ramos'},//4=2次(Neuer)
{testerId:'2',name:'Ramos'},//5=6次(罗纳尔多)
{testerId:'1',name:'Kaka'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'4',name:'Neuer'},
{testerId:'4',name:'Neuer'},
{testerId:'1',name:'Kaka'},
{testerId:'2',name:'Ramos'},
{testerId:'2',name:'Ramos'},
{testerId:'2',name:'Ramos'},
{testerId:'5',姓名:'Ronaldo'},
],
mySet=新集合(),
countObj={};
对于(让arr的obj){
if(mySet.has(obj.name))countObj[obj.name]++;
否则{
countObj[obj.name]=1;
mySet.add(对象名称);
}
}
arr=arr.sort(函数(a,b){
返回(countObj[a.name]-countObj[b.name]);
});

控制台日志(arr)我将通过3个步骤解决此问题:

1) 计算输入中每个元素出现的次数

2) 按降序排列出现的#

3) 提取名称字段

let input=[
{testerId:'1',name:'Kaka'},
{testerId:'3',name:'mesi'},
{testerId:'3',name:'mesi'},
{testerId:'3',name:'mesi'},
{testerId:'3',name:'mesi'},
{testerId:'2',name:'Ramos'},
{testerId:'2',name:'Ramos'},
{testerId:'1',name:'Kaka'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'5',姓名:'Ronaldo'},
{testerId:'4',name:'Neuer'},
{testerId:'4',name:'Neuer'},
{testerId:'1',name:'Kaka'},
{testerId:'2',name:'Ramos'},
{testerId:'2',name:'Ramos'},
{testerId:'2',name:'Ramos'},
{testerId:'5',姓名:'Ronaldo'},
];
//1)
让计数=输入。减少((res,val)=>{
if(res[val.name]){
res[val.name]++;
}否则{
res[val.name]=1;
}
返回res;
}, {});
让输出=对象。条目(计数)
.sort((a,b)=>b[1]-a[1])//2)
.map(v=>v[0])//3)

控制台日志(输出)
您可以使用
Map
通过
testerId
帮助分组

下面是一个函数式编程风格的实现:

const myArray=[{testerId:'1',name:'Kaka'},{testerId:'3',name:'mesi'},{testerId:'3',name:'mesi'},{testerId:'3',name:'mesi'},{testerId:'2',name:'Ramos'},{testerId:'2',name:'Ramos'},{testerId:'1',name:'Kaka'},{testerId:'5',name:'罗纳尔多,{testerId:',{testerId:'5',姓名:'Ronaldo'},{testerId:'5',姓名:'Ronaldo'},{testerId:'4',姓名:'Neuer'},{testerId:'4',姓名:'Neuer'},{testerId:'1',姓名:'Kaka'},{testerId:'2',姓名:'Ramos,{testerId:'Ramos 2',姓名:'Ramos,{testerId:'5',姓名:'Ronaldo'}]
const result=Array.from(
myArray.reduce((地图,项目)=>
(map.get(item.testerId.count++,map)
,新映射(myArray.Map(o=>
[o.testerId,Object.assign({},o,{count:0})]
))),([k,o])=>o
).sort((a,b)=>b.count-a.count)
.map(o=>o.name);

console.log(result);
您的问题是什么?您尝试了什么?我的问题是如何根据事件对对象数组进行排序?以及,您尝试了什么?因为您显示的输出与您开始使用的数组没有任何对应关系,除了对象“name”键具有相同的元素。你想要一个函数,在给定一个对象数组的情况下生成一个新数组吗?因为这样看来,你应该只计算对象的数量并比较计数。不是我。实际上我正在尝试你的解决方案。非常感谢!你的解决方案确实帮助了我,因为我因为我拥有的大数据而被超级卡住了。很高兴我加入了uld帮助!功能性!==难以阅读…OP应该如何