Javascript 根据不同字段对对象数组进行排序
嗨,伙计们,我有一系列像Javascript 根据不同字段对对象数组进行排序,javascript,Javascript,嗨,伙计们,我有一系列像 const data = [ { bid: 15000, product: "hotel", bdetails: { event_start_date: "2021-04-28 00:00:00" }, }, { bid: 15001, product: "hotel", bdetails: { event_start_date: "202
const data = [
{
bid: 15000,
product: "hotel",
bdetails: { event_start_date: "2021-04-28 00:00:00" },
},
{
bid: 15001,
product: "hotel",
bdetails: { event_start_date: "2021-04-27 00:00:00" },
},
{
bid: 15002,
product: "flight",
bdetails: { depart: "2019-06-18 07:55:00" },
},
{
bid: 15003,
product: "flight",
bdetails: { depart: "2019-06-18 08:55:00" },
},
{
bid: 15004,
product: "hotel",
bdetails: { event_start_date: "2021-04-28 00:00:00" },
},
];
所以我需要在这里应用多重排序顺序
产品=航班的所有项目将首先到达
所有带有product=hotel的项目最终都会到达
在所有航班项目中,它们将按b详细信息进行排序。按升序出发
所有带有酒店的项目都将按b详细信息。事件\开始\日期升序排序
到目前为止,我能够按照逻辑先排序航班,最后排序酒店
data.sort((a, b) => {
if (a.product == 'flight') {
return -1;
} else {
return b.product == 'flight' ? 1 : 0;
}
});
但现在,我正忙于根据航班和酒店的b详细信息。出发和b详细信息。事件开始日期分别对它们进行排序。手动排序容易出错,尤其是在日期方面。将权力下放给洛达斯将是明智的 对于您的解决方案,在lodash的帮助下很容易做到以下几点 从“lodash”导入 const hotels=data.filterx=>x.product=='hotel' const orderedHotels=\uu.orderByhotels,['bdetails.event\u start\u date',['asc'] const flights=data.filterx=>x.product=='flights' const orderedFlights=.[uu.orderByflights,['b详细信息.出发]],['asc'] const result=orderedfights.concatorderedHotels console.log{hotels,orderedHotels,flights,orderedFlights,result} 结果将是
[{
"bid": 15001,
"product": "hotel",
"bdetails": {
"event_start_date": "2021-04-27 00:00:00"
}
}, {
"bid": 15000,
"product": "hotel",
"bdetails": {
"event_start_date": "2021-04-28 00:00:00"
}
}, {
"bid": 15004,
"product": "hotel",
"bdetails": {
"event_start_date": "2021-04-28 00:00:00"
}
}, {
"bid": 15002,
"product": "flight",
"bdetails": {
"depart": "2019-06-18 07:55:00"
}
}, {
"bid": 15003,
"product": "flight",
"bdetails": {
"depart": "2019-06-18 08:55:00"
}]
手动排序容易出错,尤其是在日期方面。将权力下放给洛达斯将是明智的 对于您的解决方案,在lodash的帮助下很容易做到以下几点 从“lodash”导入 const hotels=data.filterx=>x.product=='hotel' const orderedHotels=\uu.orderByhotels,['bdetails.event\u start\u date',['asc'] const flights=data.filterx=>x.product=='flights' const orderedFlights=.[uu.orderByflights,['b详细信息.出发]],['asc'] const result=orderedfights.concatorderedHotels console.log{hotels,orderedHotels,flights,orderedFlights,result} 结果将是
[{
"bid": 15001,
"product": "hotel",
"bdetails": {
"event_start_date": "2021-04-27 00:00:00"
}
}, {
"bid": 15000,
"product": "hotel",
"bdetails": {
"event_start_date": "2021-04-28 00:00:00"
}
}, {
"bid": 15004,
"product": "hotel",
"bdetails": {
"event_start_date": "2021-04-28 00:00:00"
}
}, {
"bid": 15002,
"product": "flight",
"bdetails": {
"depart": "2019-06-18 07:55:00"
}
}, {
"bid": 15003,
"product": "flight",
"bdetails": {
"depart": "2019-06-18 08:55:00"
}]
您可以为酒店和航班创建两个单独的阵列。按照相应的属性顺序对它们进行排序
const hotels = [],
flights = []
for (const o of data) {
if (o.product === 'flight')
flights.push(o)
else if (o.product === 'hotel')
hotels.push(o)
}
flights.sort((a, b) => new Date(a.bdetails.depart) - new Date(b.bdetails.depart))
hotels.sort((a, b) => new Date(b.bdetails.event_start_date) - new Date(a.bdetails.event_start_date))
const output = flights.concat(hotels)
你可以让它充满活力。您可以创建一个具有
每个产品都是关键。
每种产品的优先级
排序方向:1表示升序,-1表示降序
b详细信息中需要用于日期排序的内部属性名称
如果您有更多的产品值和自定义日期属性名称,则可以将其添加到此对象
施工数据=[{投标:15000,产品:酒店,详细信息:{事件开始日期:2021-04-28 00:00:00},},{投标:15001,产品:酒店,详细信息:{事件开始日期:2021-04-27 00:00:00},},{投标:15002,产品:航班,详细信息:{出发日期:2019-06-18 07:55:00},},{投标:15003,产品:航班,详细信息:{出发日期:2019-06-18:00:00},{酒店,详细信息:{事件开始日期:2021-04-28 00:00:00},},];
常量顺序={
航班:{
优先事项:1,
方向:1,,
排序:离开,
},
酒店:{
优先事项:2,
方向:-1,
sortProp:事件\开始\日期
}
}
data.sorta,b=>{
const productSort=订单[a.product]。优先级-订单[b.product]。优先级
if productSort
返回产品排序
const{direction,sortProp}=顺序[a.product];
返回方向*new Datea.bdetails[sortProp]-new Dateb.bdetails[sortProp]
}
console.logdata您可以为酒店和航班创建两个单独的数组。根据各自的属性按顺序对它们进行排序
const hotels = [],
flights = []
for (const o of data) {
if (o.product === 'flight')
flights.push(o)
else if (o.product === 'hotel')
hotels.push(o)
}
flights.sort((a, b) => new Date(a.bdetails.depart) - new Date(b.bdetails.depart))
hotels.sort((a, b) => new Date(b.bdetails.event_start_date) - new Date(a.bdetails.event_start_date))
const output = flights.concat(hotels)
你可以把它变成动态的,你可以创建一个订单对象
每个产品都是关键。
每种产品的优先级
排序方向:1表示升序,-1表示降序
b详细信息中需要用于日期排序的内部属性名称
如果您有更多的产品值和自定义日期属性名称,则可以将其添加到此对象
施工数据=[{投标:15000,产品:酒店,详细信息:{事件开始日期:2021-04-28 00:00:00},},{投标:15001,产品:酒店,详细信息:{事件开始日期:2021-04-27 00:00:00},},{投标:15002,产品:航班,详细信息:{出发日期:2019-06-18 07:55:00},},{投标:15003,产品:航班,详细信息:{出发日期:2019-06-18:00:00},{酒店,详细信息:{事件开始日期:2021-04-28 00:00:00},},];
常量顺序={
航班:{
优先事项:1,
方向:1,,
排序:离开,
},
酒店:{
优先事项:2,
方向:-1,
sortProp:事件\开始\日期
}
}
data.sorta,b=>{
const productSort=订单[a.product]。优先级-订单[b.product]。优先级
if productSort
返回产品排序
const{direction,sortProp}=顺序[a.product];
返回方向*new Datea.bdetails[sortProp]-new Dateb.bdetails[sortProp]
}
console.logdata您可以这样做, 在我们的自定义排序功能中,我们为这两种产品类型分配一个优先级,并尝试在此基础上进行排序,如果优先级相同,则我们将按b详细信息。出发航班和b详细信息。事件\开始\日期酒店进行排序 const sortData=数据=>{ 常量优先级={ 航班:1, 酒店:2 }; return data.sortitemA,itemB=>{ const diff=优先级[itemA.product]-优先级[itemB.product]; 如果diff!==0,则返回diff; //这两个项目 我们生产同样的产品 const product=itemA.product; 退货产品=='航班'? 新建DateitemA.bdetails.Deep-新建DateitemB.bdetails.Deep: new DateitemB.bdDetails.event_start_date-new DateitemA.bdDetails.event_start_date; }; };
你可以这样做, 在我们的自定义排序功能中,我们为这两种产品类型分配一个优先级,并尝试在此基础上进行排序,如果优先级相同,则我们将按b详细信息。出发航班和b详细信息。事件\开始\日期酒店进行排序 const sortData=数据=>{ 常量优先级={ 航班:1, 酒店:2 }; return data.sortitemA,itemB=>{ const diff=优先级[itemA.product]-优先级[itemB.product]; 如果diff!==0,则返回diff; //这两种产品有相同的产品 const product=itemA.product; 退货产品=='航班'? 新建DateitemA.bdetails.Deep-新建DateitemB.bdetails.Deep: new DateitemB.bdDetails.event_start_date-new DateitemA.bdDetails.event_start_date; }; };
我建议把它们分成两种不同的类别。首先是日期,然后是产品。我建议将它们按不同的排序进行两次排序。首先是日期,然后是产品。你能推荐一些香草味的吗?为什么你想要一个完整的库来对一些数组进行排序?我喜欢将酒店和航班分成两个数组,然后联系启用themFYI的部分。他需要一些比完美更好的东西。你能推荐一些更香草的吗?为什么你想要一个完整的库来对一些数组进行排序?我喜欢将酒店和航班分成两个数组,然后联系启用themFYI的部分。他需要比完美更好的东西。