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的部分。他需要比完美更好的东西。