Как сортировать с картой по значению в JavaScript - PullRequest
0 голосов
/ 26 мая 2020

Привет, я учусь работать с JS и firebase. Моя проблема: мои заказы загружаются случайным образом, и я всегда хочу, чтобы они были отсортированы по времени. Я пробовал отсортировать данные из firebase, но они все равно приходят случайным образом.

Ив'е рассмотрел пару вещей, касающихся сортировки моей карты, называемой «строками», но, похоже, не смог реализовать это каким-либо разумным способом.

Вот как я пытался отсортировать свою базу db, прежде чем получить его на моей странице заказа

// route for database 
router.get("/orderslist", (req, res) => {    

  let orders = []
  let number_of_orders

    // Getting the snapshot of the order collection
    db.collection('orders').orderBy('time').get().then( productSnapshot => {
      number_of_orders = productSnapshot.size

      // iterating over the order snapshot
      productSnapshot.forEach(orderDoc => {

        // creating an order object and assigning the ID and the rest of the information from the database
        var order = {
          id: orderDoc.id,
          customer_name: orderDoc.data().customer_name,
          date: orderDoc.data().date,
          comments: orderDoc.data().comments,
          time: orderDoc.data().time,
          total: orderDoc.data().total,
          order_status: orderDoc.data().order_status,
          products: []
        }
        // using the id, to get the products from the subcollection
        db.collection('orders/' + order.id + '/products').get().then( productSnapshot => {

          // iterating over the product snapshot
          productSnapshot.forEach(productDoc => {

            // creating a product object
            var product = {
              name: productDoc.data().name,
              price: productDoc.data().price
            }

            // then we push the product object to the list of products in the order object
            order.products.push(product)

          });

          // we are finished iterating over the productsnapshot and now we can push it to the orders list
          orders.push(order)

          // checks if the list is filled with everything from the database
          if(orders.length == number_of_orders){
            return res.json(orders)
          }

        });

      });

  });

});

Это мой json ввод

[
  {
    "id": "s2hym8IVa10pEgtgmmq9",
    "customer_name": "Mikkel",
    "date": "13/05-2020",
    "comments": "",
    "time": 1050,
    "total": 40,
    "order_status": true,
    "products": [
      {
        "name": "Latte",
        "price": 40
      }
    ]
  },
  {
    "id": "xWmlB9fHD4rw8Di75llp",
    "customer_name": "Emil",
    "date": "07/05-2020",
    "comments": "without sugar",
    "time": 1211,
    "total": 40,
    "order_status": false,
    "products": [
      {
        "name": "Latte",
        "price": 40
      }
    ]
  },
  {
    "id": "ggYSVKA1i0U8khIpeud4",
    "customer_name": "Oliver",
    "date": "01/05-2020",
    "comments": "order to be packed neatly because im on a bike",
    "time": 1450,
    "total": 38,
    "order_status": false,
    "products": [
      {
        "name": "Latte Macchiato",
        "price": 38
      }
    ]
  },
  {
    "id": "pq62yo42KS41VgeGGiZX",
    "customer_name": "Naida",
    "date": "07/05-2020",
    "comments": "nope",
    "time": 1257,
    "total": 40,
    "order_status": true,
    "products": [
      {
        "name": "Latte",
        "price": 40
      }
    ]
  },
  {
    "id": "p2dKspiU535P29Gex6Uz",
    "customer_name": "Alper",
    "date": "13/05-2020",
    "comments": "",
    "time": 1937,
    "total": 40,
    "order_status": false,
    "products": [
      {
        "name": "Latte",
        "price": 40
      }
    ]
  }
]

Это моя страница заказа JS

  // jquery getting our json order data from API
    $.get("http://localhost:8888/orderslist", (data) => {    


        // loops through our orderlist api
        let rows = data.map(item => {
          let $clone = $('#frontpage_new_ordertable tfoot tr').clone();
          $clone.data("id", item.id);
          $clone.find('.customer_name').text(item.customer_name);
          $clone.find('.date').text(item.date);
          $clone.find('.time').text(item.time);
          $clone.find('.pickup').text(item.pickup);
          $clone.find('.comments').text(item.comments);
          $clone.find('.total').text(item.total + ' Kr.');


          // accept and cancel buttons
          $clone.find('.order_status').html(
            `<button class="acceptOrder" type="button">Accept</button>` + 
            `<button class="cancelOrder" type="button">Cancel</button>`
          );

          // loops through orders product name
          let productsName = item.products.map(prod => `${prod.name}`);
          $clone.find('.products').html(productsName.join('<br />'));

          // loops through orders product price
          let productsPrice = item.products.map(prod => `${prod.price} Kr.`);
          $clone.find('.price').html(productsPrice.join('<br />'));

          return $clone;
        });


        //appends to our frontpage html 
        $("#frontpage_new_ordertable tbody").append(rows);
    });

});

Ответы [ 2 ]

0 голосов
/ 26 мая 2020

Я думаю, это то, что вы ищете: data.sort

Пример. (функция для сортировки)

data.sort((a,b)=>{
  return (a.date > b.date)
})

Это будет работать, только если item.date - это Date Object.

Для создания объекта даты вы можете использовать: new Date(item.date)

PS. вы можете перевернуть этот знак > с помощью <, чтобы изменить порядок

0 голосов
/ 26 мая 2020

Вы можете попробовать это

const rows = [{time: 1}, {time: 1050}, {time: 238}, {time: 9999}]

//sorted result
rows.sort((a,b) => a.time - b.time)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...