Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.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
使用Typescript/javascript自定义排序_Javascript_Typescript - Fatal编程技术网

使用Typescript/javascript自定义排序

使用Typescript/javascript自定义排序,javascript,typescript,Javascript,Typescript,我有以下数据: Data = [ { "rock": "granite", "youngerThan": "schist"}, { "rock": "basalt", "youngerThan": null}, { "rock": "Picrite", "youngerThan": "granite"}, { "rock": "schist", "youngerThan": "basalt"} ] etc,我想根据属性youngerThan为rock获得一个排序数组。请注意,y

我有以下数据:

Data = [
  { "rock": "granite", "youngerThan": "schist"},
  { "rock": "basalt", "youngerThan": null},
  { "rock": "Picrite", "youngerThan": "granite"},
  { "rock": "schist", "youngerThan": "basalt"}
]
etc,我想根据属性
youngerThan
rock
获得一个排序数组。请注意,
youngerThan
可以是未定义的,这意味着该岩石是最古老的(位于底部)

因此,我想得到以下列表:(从大到小)

玄武岩、片岩、花岗岩、苦橄榄石

从最小到最大

苦橄榄石、花岗岩、片岩、玄武岩
//区分大小写
var数据=[{“岩石”:“花岗岩”,“雅戈尔坦”:“片岩”},{“岩石”:“片岩”,“雅戈尔坦”:“玄武岩”},{“岩石”:“玄武岩”},{“岩石”:“花岗岩”,“雅戈尔坦”:“苦橄榄石”}]
数据排序((a,b)=>{
如果(!a.youngerThan | a.youngerThanb.youngerThan){
返回1
}
返回0
})

控制台日志(数据)javascript中的sort函数可以将可选的比较器作为参数,以便按照定义的顺序对复杂对象(如您拥有的对象)进行排序。我不完全明白你想要什么,但像这样的事情是可以做到的。我的意思是你可以在这里修改这个自定义函数,根据你自己的喜好对对象进行排序

更多信息


至少您需要按照给定的与树的关系对数据进行排序,然后通过遍历树得到排序结果

var数据=[{岩石:“花岗岩”,雅戈尔坦:“片岩”},{岩石:“玄武岩”,雅戈尔坦:空},{岩石:“苦橄榄石”,雅戈尔坦:“花岗岩”},{岩石:“片岩”,雅戈尔坦:“玄武岩”},
树=函数(数据,根){
var r=[],o={};
data.forEach(函数(a){
o[a.rock]={data:a,children:o[a.rock]&&o[a.rock].children};
if(a.youngerThan==根){
r、 推(o[a.rock]);
}否则{
o[a.youngerThan]=o[a.youngerThan]| |{};
o[a.youngerThan]。children=o[a.youngerThan]。children | |[];
o[a.youngerThan].儿童.推(o[a.rock]);
}
});
返回r;
}(数据,空),
排序=tree.reduce(函数遍历(r,a){
返回r.concat(a.data,(a.children | |[])。reduce(transverse,[]);
}, [])
控制台日志(已排序);
控制台日志(树)

。作为控制台包装{max height:100%!important;top:0;}
好主意,你尝试了什么?从上面的陈述中,很明显,[granite<片岩<玄武岩],[granite<苦橄榄石]。当您需要比较片岩和苦橄榄石时,条件是什么?这将执行三个简单的排序操作1.youngerThan 2.null 3.same rock(P.V THOMAS)感谢您的解决方案效果最佳,注意:重复相同的“rock”时,您的输入数据中有一个输入错误属性两次,这不应该发生。如果
a
b
之间没有直接连接,则需要它们之间的信息。抱歉@NinaScholz,我不明白重点。给定问题的数组,我们可以使用
youngerThan
属性进行比较。我错了吗?
function compare(obj1,obj2){
if(obj1.youngerThan === null)
    return -1;
else
    return 1;
}

var Data = [
{ "rock": "granite", "youngerThan": "schist"},
{ "rock": "schist", "youngerThan": "basalt"},
{ "rock": "basalt", "youngerThan": null},
{ "rock": "granite", "youngerThan": "picrite"}
];

Data.sort(compare);

console.log(Data);
/*
[ { rock: 'basalt', youngerThan: null },
{ rock: 'granite', youngerThan: 'picrite' },
{ rock: 'schist', youngerThan: 'basalt' },
{ rock: 'granite', youngerThan: 'schist' } ]
*/