【问题标题】:Move elements with specific values to bottom of sorted array in js将具有特定值的元素移动到js中排序数组的底部
【发布时间】:2023-01-11 17:19:18
【问题描述】:

我有一个对象数组,我想按特定值 f.x. 对它们进行排序。价格。这些对象有一个名为 "status" 的项目,它可以有一个 "available", "reserved" or "occupied"。 f.x 价格的排序工作得很好,但我想要实现的是获取排序后的数组并取出状态不是 "available" 的项目并将它们放在数组的底部,"reserved""occupied"之前,也是按价格排序的。

所以当我有一个随机排序的数组时

[{
    id: 1619,
    address: "Street 1",
    rooms: 3,
    price: 10695, 
    status: "Available",
},
{
    id: 1620,
    address: "Street 5",
    rooms: 3,
    price: 7859, 
    status: "Available",
},
{
    id: 1626,
    address: "Street 7",
    rooms: 3,
    price: 8595, 
    status: "Reserved",
},
{
    id: 1624,
    address: "Street 11",
    rooms: 4,
    price: 9795, 
    status: "Occupied",
},
{
    id: 1624,
    address: "Street 3",
    rooms: 4,
    price: 2856, 
    status: "Reserved",
}]

并使用

function sortList(property, list, order) {
        list.sort(function (a, b) {
            if (a[property] === b[property]) {
                return 0;
            }
            const va = a[property];
            const vb = b[property];

            if (order === 'asc') {
                return va < vb ? 1 : -1;
            }
            return va > vb ? 1 : -1;
        });
    }

    sortList("price", list, "desc");

按价格排序 - 这很好用。然后我想获取排序后的列表并将“Reserved”和“Occupied”放在数组的底部 - 仍然按价格排序,所以我最终得到这样的数组:

[{
    id: 1620,
    address: "Street 5",
    rooms: 3,
    price: 7859, 
    status: "Available",
},
{
    id: 1619,
    address: "Street 1",
    rooms: 3,
    price: 10695, 
    status: "Available",
},
{
    id: 1624,
    address: "Street 3",
    rooms: 4,
    price: 2856, 
    status: "Reserved",
},
{
    id: 1626,
    address: "Street 7",
    rooms: 3,
    price: 8595, 
    status: "Reserved",
},
{
    id: 1624,
    address: "Street 11",
    rooms: 4,
    price: 9795, 
    status: "Occupied",
}]

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    筛选出您想要的项目,将它们从列表中删除,然后将它们推到列表的末尾(排序后)。

    const list = [{
        id: 1619,
        address: "Street 1",
        rooms: 3,
        price: 10695,
        status: "Available",
      },
      {
        id: 1620,
        address: "Street 5",
        rooms: 3,
        price: 7859,
        status: "Available",
      },
      {
        id: 1626,
        address: "Street 7",
        rooms: 3,
        price: 8595,
        status: "Reserved",
      },
      {
        id: 1624,
        address: "Street 11",
        rooms: 4,
        price: 9795,
        status: "Occupied",
      },
      {
        id: 1624,
        address: "Street 3",
        rooms: 4,
        price: 2856,
        status: "Reserved",
      }
    ];
    
    function sortList(property, list, order) {
      list.sort(function(a, b) {
        if (a[property] === b[property]) {
          return 0;
        }
        const va = a[property];
        const vb = b[property];
    
        if (order === 'asc') {
          return va < vb ? 1 : -1;
        }
        return va > vb ? 1 : -1;
      });
    }
    
    function extractItems(list) {
      const extracted = list.filter(el => el.status == "Reserved" || el.status == "Occupied");
      
      list = list.filter((el) => !extracted.includes(el));
      
      list.push(extracted);
      
      return list;
    }
    
    sortList("price", list, "desc");
    newList = extractItems(list)
    
    console.log(newList);

    【讨论】:

      【解决方案2】:

      听起来您需要对数组进行两次排序。先按价格排序,再按另一个数组['reserved', 'occupied', 'available']排序;

      像这样:

      let arr = [{
          id: 1619,
          address: "Street 1",
          rooms: 3,
          price: 10695, 
          status: "Available",
      },
      {
          id: 1620,
          address: "Street 5",
          rooms: 3,
          price: 7859, 
          status: "Available",
      },
      {
          id: 1626,
          address: "Street 7",
          rooms: 3,
          price: 8595, 
          status: "Reserved",
      },
      {
          id: 1624,
          address: "Street 11",
          rooms: 4,
          price: 9795, 
          status: "Occupied",
      },
      {
          id: 1624,
          address: "Street 3",
          rooms: 4,
          price: 2856, 
          status: "Reserved",
      }];
      let sortArray = ['Reserved', 'Occupied', 'Available'];
      
      console.log(arr.sort((a, b) => (a.price > b.price) ? 1 : -1).sort((a,b) => sortArray.indexOf(a.status) - sortArray.indexOf(b.status)));
      

      【讨论】:

        【解决方案3】:

        使用数组的排序功能:

        const l = list.sort( (a,b) => {
                if(a.status === b.status) return a.price - b.price;
        
                const x = a.status === "Available" ? 0 : a.status === "Reserved" ? 1 : 2;
                const y = b.status === "Available" ? 0 : b.status === "Reserved" ? 1 : 2;
                return x-y;
        
         });
        
          console.log(l);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-16
          • 1970-01-01
          • 2016-06-16
          • 1970-01-01
          • 1970-01-01
          • 2021-09-11
          • 1970-01-01
          相关资源
          最近更新 更多