Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.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中的分组排序算法_Javascript_Sorting - Fatal编程技术网

JavaScript中的分组排序算法

JavaScript中的分组排序算法,javascript,sorting,Javascript,Sorting,快速提问。 我有一个“list”变量,它如下所示: var list = [ { appid: '753', contextid: '6', assetid: '3351193666' }, { appid: '255710', contextid: '6', assetid: '4141511622' }, { appid: '255710', contextid: '6', assetid: '4356835667' }, { appid: '255710', contextid

快速提问。 我有一个“list”变量,它如下所示:

var list = [ { appid: '753', contextid: '6', assetid: '3351193666' },
  { appid: '255710', contextid: '6', assetid: '4141511622' },
  { appid: '255710', contextid: '6', assetid: '4356835667' },
  { appid: '255710', contextid: '6', assetid: '4145011657' },
  { appid: '255710', contextid: '6', assetid: '4356835665' },
  { appid: '255710', contextid: '6', assetid: '4356835666' },
  { appid: '730', contextid: '6', assetid: '4356832195' },
  { appid: '730', contextid: '6', assetid: '4356832197' },
  { appid: '730', contextid: '6', assetid: '4356832196' },
  { appid: '321040', contextid: '6', assetid: '3682654698' },
  { appid: '321040', contextid: '6', assetid: '3542604179' },
  { appid: '322330', contextid: '6', assetid: '3498901747' },
  { appid: '322330', contextid: '6', assetid: '3903574578' },]
console.log(newlist[255710]);//all els with appid 255710
我尝试了不同的排序选项,但每次我的逻辑都无法按组进行排序。正如您所看到的,contextid并不重要,因为它在任何地方都是相同的。appid可以重复自身,但assetid总是不同的

我真的很想按appid将这些“资产”分为不同的组。 例如:

var groups = [{appid: '753', assets: [{contextid: '6', assetid: '3351193666'}]},
              {appid: '255710', assets: [{contextid: '6', assetid: '4141511622'}, {contextid: '6', appid: '4356835667'}, {contextid: '6', appid: '4145011657'}]}
              ....];
如果有人能帮我,那就太好了。我真的无法理解这一点,我的想法也差不多用完了。对不起,如果这是个愚蠢的问题

var newlist=list.reduce(function(newlist,el){
  return (newlist[el.appid]=newlist[el.appid]||[]).push(el),newlist;
},{});
这产生的不是想要的,而是非常相似的结构:

{
255710:[
    { appid: '255710', contextid: '6', assetid: '4141511622' },
    { appid: '255710', contextid: '6', assetid: '4356835667' },
    { appid: '255710', contextid: '6', assetid: '4145011657' },
    { appid: '255710', contextid: '6', assetid: '4356835665' },
    { appid: '255710', contextid: '6', assetid: '4356835666' },
],
//...
}
因此,您可以这样访问它:

var list = [ { appid: '753', contextid: '6', assetid: '3351193666' },
  { appid: '255710', contextid: '6', assetid: '4141511622' },
  { appid: '255710', contextid: '6', assetid: '4356835667' },
  { appid: '255710', contextid: '6', assetid: '4145011657' },
  { appid: '255710', contextid: '6', assetid: '4356835665' },
  { appid: '255710', contextid: '6', assetid: '4356835666' },
  { appid: '730', contextid: '6', assetid: '4356832195' },
  { appid: '730', contextid: '6', assetid: '4356832197' },
  { appid: '730', contextid: '6', assetid: '4356832196' },
  { appid: '321040', contextid: '6', assetid: '3682654698' },
  { appid: '321040', contextid: '6', assetid: '3542604179' },
  { appid: '322330', contextid: '6', assetid: '3498901747' },
  { appid: '322330', contextid: '6', assetid: '3903574578' },]
console.log(newlist[255710]);//all els with appid 255710

appid可以通过解构来删除,但我认为这不是真的必要。如果不这样做,即使从数组中复制一个对象,也可以获取appid…

如果不存在,可以使用对象作为
appid
组的引用,并创建新对象。推送具有所需属性的新对象

该方案在哈希表上使用单个循环和闭包

var list=[{appid:'753',contextid:'6',assetid:'3351193666'},{appid:'255710',contextid:'6',assetid:'4141511622'},{appid:'255710',contextid:'6',assetid:'4356835667'},{appid:'255710',contextid:'6',assetid:'4145011657'},{appid:'255710',contextid:'6',assetid:'43568335665'},{appid:'255710',contextid:'6',assetid:'4356835666'},{appid:'730',contextid:'6',assetid:'435683219'},{appid:'730',contextid:'6',assetid:'4356832196'},{appid:'321040',contextid:'6',assetid:'3682654698'},{appid:'321040',contextid:'6',assetid:'354279'},{appid:'322330',contextid:'6',assetid:'3498901747'},{appid:'322330',contextid:'6',assetid:'3903574578'},
groups=list.reduce(函数(散列){
返回函数(r,a){
如果(!hash[a.appid]){
hash[a.appid]={appid:a.appid,资产:[]};
r、 push(hash[a.appid]);
}
hash[a.appid].assets.push({contextid:a.contextid,assetid:a.assetid});
返回r;
};
}(Object.create(null)),[]);
console.log(组);

.as控制台包装{max height:100%!important;top:0;}
可能的解决方案之一

var list=[{appid:'753',contextid:'6',assetid:'3351193666'},{appid:'255710',contextid:'6',assetid:'4141511622'},{appid:'255710',contextid:'6',assetid:'4356835667'},{appid:'255710',contextid:'6',assetid:'4145011657'},{appid:'255710',contextid:'6',assetid:'43568335665'},{appid:'255710',contextid:'6',assetid:'4356835666'},{appid:'730',contextid:'6',assetid:'435683219'},{appid:'730',contextid:'6',assetid:'4356832196'},{appid:'321040',contextid:'6',assetid:'3682654698'},{appid:'321040',contextid:'6',assetid:'354279'},{appid:'322330',contextid:'6',assetid:'3498901747'},{appid:'322330',contextid:'6',assetid:'3903574578'}],obj={};
列表.forEach(函数(v){
(obj[v.appid]| |(obj[v.appid]=[])).push({contextid:v.contextid,assetid:v.assetid});
});
var res=Object.keys(obj.map)(v=>Object.assign({},{appid:v,assets:obj[v]}));

console.log(res);
您可以使用lodash执行此操作:

var list=[{appid:'753',contextid:'6',assetid:'3351193666'},
{appid:'255710',contextid:'6',assetid:'4141511622'},
{appid:'255710',contextid:'6',assetid:'4356835667'},
{appid:'255710',contextid:'6',assetid:'4145011657'},
{appid:'255710',contextid:'6',assetid:'4356835665'},
{appid:'255710',contextid:'6',assetid:'4356835666'},
{appid:'730',contextid:'6',assetid:'4356832195'},
{appid:'730',contextid:'6',assetid:'4356832197'},
{appid:'730',contextid:'6',assetid:'4356832196'},
{appid:'321040',contextid:'6',assetid:'3682654698'},
{appid:'321040',contextid:'6',assetid:'3542604179'},
{appid:'322330',contextid:'6',assetid:'3498901747'},
{appid:'322330',contextid:'6',assetid:'3903574578'},]
var newList=[];
_.每个(列表、功能(项目){
var index=uu.findIndex(newList,{'appid':item.appid});
如果(索引==-1)
newList.push({appid:item.appid,资产:[
_.omit(项,['appid'])]});
else newList[index].assets.push(u.omit(item,['appid']))
});
console.log(newList);
的可能重复项