JavaScript中具有复杂数据的排序和比较函数
多亏了这个线程,我很理解compare函数的工作原理 但我想知道如何将其用于复杂数据,例如: 假设我有以下数据JavaScript中具有复杂数据的排序和比较函数,javascript,sorting,compare,Javascript,Sorting,Compare,多亏了这个线程,我很理解compare函数的工作原理 但我想知道如何将其用于复杂数据,例如: 假设我有以下数据 var data = [{ id: _A2, parent: { parent_id: _A1 }, createdOn: 1.1 },{ id:_A4, parent: null , createdOn: 1.1 },{ id: _A1, parent: null , createdOn: 1 },{ id: _A3,
var data = [{
id: _A2,
parent: {
parent_id: _A1
},
createdOn: 1.1
},{
id:_A4,
parent: null ,
createdOn: 1.1
},{
id: _A1,
parent: null ,
createdOn: 1
},{
id: _A3,
parent: {
parent_id: _A1
},
createdOn: 1.2
},{
id: _A5,
parent: {
parent_id: _A4
},
createdOn: 1.2
}]
我想先按创建日期对其进行排序,然后将儿童与其父母分组,这将为我们提供:
var data = [{
id: _A1,
parent: null ,
createdOn: 1
},{
id: _A2,
parent: {
parent_id: 1
},
createdOn: 1.1
},{
id: _A3,
parent: {
parent_id: 1
},
createdOn: 1.2
},{
id: _A4,
parent: null ,
createdOn: 1.1
},{
id: _A5,
parent: {
parent_id: _A4
},
createdOn: 1.2
}]
甚至可以使用排序功能吗 同一篇文章的第二个答案很好地解释了如何比较对象数组中的特定属性: 例如,如果要比较创建日期,可以执行以下操作
var sortedArray = myArray.sort(function(a,b){
return (a.createdOn - b.createdOn);
});
或者,如果您想按id进行比较,您可以比较字符串中的每个字符
\u A1
我相信这符合您的要求。简言之,单靠排序无法回答您的问题
data.sort(function(rec1, rec2) {
return rec1.createdOn - rec2.createdOn;
});
var grouped = [];
data.forEach(function(record) {
if (!record.parent) {
grouped.push(record);
data.forEach(function(child) {
if (child.parent) {
if (child.parent.parent_id == record.id) grouped.push(child);
}
});
}
});
data = grouped;
更新
这里是我提供的一个解决方案:
var数据=[{
id:“_A2”,
颜色:“#00ff00”,
家长:{
父项id:“\u A1”
},
创建:1.1
}, {
id:'uA4',
颜色:“#bf1616”,
父项:null,
创建:1.1
}, {
id:'uA1',
父项:null,
颜色:“#469649”,
创建:1
}, {
id:'uA3',
颜色:“#00ff00”,
家长:{
创建:1,
父项id:“\u A1”
},
创建:1.2
}, {
id:“_A5”,
颜色:“#f62222”,
家长:{
创建:1.1,
父项id:“\u A4”
},
创建:1.2
},{
id:“_A6”,
颜色:“#00ff00”,
家长:{
创建:1,
父项id:“\u A1”
},
创建:11
},{
id:'uA8',
颜色:'黄色',
家长:{
创建:0.5,
父项id:“\u A1”
},
已创建:0.6
},{
id:'uA7',
颜色:“#c2c22b”,
父项:null,
已创建:0.5
}],
ct=document.getElementById(“无序数据”),
结果=document.getElementById(“结果”),
createRow=函数(行){
var child=document.createElement('div');
child.innerHTML=''+行['id']+'-'+行['created']+'';
返回儿童
},
compareFn=功能(左、右){
返回值(lhs>rhs)?1:(lhs
.row{
显示:块;
宽度:200px;
填充:10px;
}
无序数据
结果
谢谢您的快速回复,但它没有回答我的问题。这里有一个关于我想要实现什么的小插曲:这毫无意义。你说你想按创建日期订购,但你想在A4之前订购A3?@Oriol为什么它没有意义,也许你需要在投票表决我的问题之前了解更多有关排序的信息!检查我的解决方案,它没有意义,因为1.1<1.2
,所以A4应该在A3之前。不确定你想要什么样的排序,但这不是“先按创建日期排序”。让我们试着给它更多的感觉。。假设您有一个简单的json注释,与上面示例中的子注释或回复混合。。我想显示父注释以及按创建日期排序的子注释。。不管子项创建日期是否大于其他父项,它都应该位于其父项之下——子项最终将按asc方向排序。