Фильтровать массив заказов и запрашивать метод PUT для обновления отфильтрованных заказов с помощью javascript

#javascript #arrays #rest #object #shopify-api

#javascript #массивы #остальное #объект #Shopify-api

Вопрос:

Мне трудно понять, как фильтровать и обновлять API для отфильтрованных заказов:

На панели заказов Shopify я выполнил вызов API и получил список всех заказов. Я добиваюсь обновления только 1 массива с помощью метода put, но он не динамический. Итак, в основном то, что я пытаюсь сделать, это :

Кстати, это все javascript

ПОЛУЧИТЬ вызов api для всех заказов, затем отфильтровать заказы, у которых есть КАК страна Канада, так и пустой номер телефона, затем для этих заказов с Канадой и пустым номером я попытался обновить их с помощью метода PUT, чтобы изменить номер на «фиктивный номер», но не могу применить это только к тем заказам с Канадой и пустым номером. Я получил все заказы и получил массив объектов порядка 6. Пока это мой код.

 
   $(document).ready(function () {
// this is valid url and returns all orders
  var api_url = "https://($api-domain-bla-bla)/admin/api/2020-10/orders.json?status=any.json";

  $.ajax({
    url: api_url,
    contentType: "application/json",
    dataType: "json",
    success: function (result) {
      console.log(result);
//       get all orders phone country
      let orders = result.orders;
      console.log(orders);
      for(let i = 0; i < orders.length;i  ) {
        let phone = orders[i].shipping_address.phone;
        let country = orders[i].shipping_address.country;
//    here i am trying to filter them right away but don't know how to make array of filter objects
//    the if statement works
        if ( country === "Canada" amp;amp; phone === '') {
            // over here i am trying to do something to those objects which if statement is true.
            let filteredOrder = orders[i].concat
            console.log(orderId);
            // a function with parameter of the filtere objects variable, to the api PUT method to update 
            // the filter orders/objects
            checkCountry(filteredOrder);
        }
//         console.log(phone);
//         console.log(country);
        
//         checkPhone(phone, country);      
      }

    },
  });
});
  

это то, что я получаю из console.log (результат)

https://prnt.sc/vls9qq

https://prnt.sc/vlsh55 (api для всех заказов)

 function checkCountry(order) {
// here i want to update the orders with canada and blank phone number, to put "00000" on the phone 
 //number i had code here with some if statements but i figured it wouldn't work so i am trying new way 
  //to get it to work 
    var api_url_post = "https://($api-domain-bla-bla)/admin/api/2020-10/orders.json?status=any.json";
    // this phone variable the structure is the same with the one i get from the call above, don't know 
    // why it doesn't accept it.
    var phone = {
        "orders": 
          {
//             "id": 1843613401136,
//           "phone": " 0000000000",
          "shipping_address": {
          "phone": "0000000000"
          }
          },
      }
    $.ajax({
          method: "PUT",
          url: api_url_post,
          contentType: "application/json",
          crossDomain: true,
          dataType: "json",
          data: JSON.stringify(phone),
          success: function (data, status, jqXHR) {
              alert("success");// write success in " "
          },
  
          error: function (jqXHR, status) {
              // error handler
              console.log(jqXHR);
              alert('fail'   status.code);
          }
       });
}
 
  

Извините, если я неясно выразился, какая-нибудь помощь?

Ответ №1:

Я не уверен, чего вы пытаетесь достичь. Насколько я понимаю, это:

  1. Вы делаете запрос API для получения списка заказов.
  2. Вы хотите отфильтровать этот список для заказов из Канады без номера телефона.
  3. Вы хотите отредактировать отфильтрованный список с фиктивными номерами телефонов и перенести эти изменения на сервер.

Я мало что знаю о том, как написан api для получения / размещения заказов, поэтому то, что я имею в виду, может быть неэффективным. Я бы сопоставил все заказы и изменил канадские заказы без номера телефона

 orders = orders.map(order=>{
  let {country, phone } = order.shipping_address
  if(country === "Canada" amp;amp; phone === ''){
    order.shipping_address.phone = '0000000'
  }
  return order
})
  

И вместо того, чтобы помещать filteredOrders, просто поместите их все

 $.ajax({
          method: "PUT",
          url: api_url_post,
          contentType: "application/json",
          crossDomain: true,
          dataType: "json",
          data: JSON.stringify(orders),
          success: function (data, status, jqXHR) {
              alert("success");// write success in " "
          },
  
          error: function (jqXHR, status) {
              // error handler
              console.log(jqXHR);
              alert('fail'   status.code);
          }
       });
  

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

Ответ №2:

     $(document).ready(function () {
  var api_url = "https://api-blalbla/admin/api/2020-10/orders.json?status=any.json";

  $.ajax({
    url: api_url,
    contentType: "application/json",
    dataType: "json",
    success: function (result) {
      console.log(result);
//       get all orders phone country
      let orders = result.orders;
      console.log(orders);
      orders = orders.map(order=>{
        let {country, phone } = order.shipping_address
        if(country === "Canada" amp;amp; phone === ''){
        order.shipping_address.phone = '0000000'
        checkCountry(order, orders)
            console.log(orders);
            console.log(order);
        }
        else {
          return order
        }
      
        
        
})
    },
  });
});

function checkCountry(filteredOrder, allOrders) {
     
    var api_url_post = "https://api-blalbla/admin/api/2020-10/orders.json?status=any.json";
    
//     var phone = {
//         "orders": 
//           {
// //               "id": 1843613401136,
// //               "phone": " 0000000000",
//                  "shipping_address": {
//                  "phone": "0000000000"
//           }
//           },
//       }
    $.ajax({
          method: "PUT",
          url: api_url_post,
          contentType: "application/json",
          crossDomain: true,
          dataType: "json",
          data: JSON.stringify(allOrders),
          success: function (data, status, jqXHR) {
              alert("success");// write success in " "
          },
  
          error: function (jqXHR, status) {
              // error handler
              console.log(jqXHR);
              alert('fail'   status.code);
          }
       });
            
}
  

Это мой код до сих пор, пытался поместить все заказы в данные, как вы сказали, все та же ошибка при запросе put

https://prnt.sc/vm3edm

Кроме того, я понял, что вы можете получить конкретный заказ по идентификатору

 /admin/api/2020-10/orders/{order_id}.json
  

Итак, mby я получаю идентификатор отфильтрованного заказа и ввожу параметр в URL и обновляю этот заказ с помощью телефона «00000». Должно ли это работать?

Ответ №3:

Да, это сработало так

 Also, I figured that u can get specific order by id

/admin/api/2020-10/orders/{order_id}.json
So mby i get the filtered order id and put in parameter on url and update that order with phone "00000". Should this work?
  

Большое вам спасибо, этот фрагмент кода мне помог, я благодарен! 🙂

    orders = orders.map(order=>{
  let {country, phone } = order.shipping_address
  if(country === "Canada" amp;amp; phone === ''){
    order.shipping_address.phone = '0000000'
  }
  return order
})
  

Ответ №4:

ОБНОВЛЕНИЕ: есть ли возможность получить только первый заказ из массива?

 // mby like except .map to [0]
orders = orders[0](order=>{
  let {country, phone } = order.shipping_address
  if(country === "Canada" amp;amp; phone === ''){
    order.shipping_address.phone = '0000000'
  }
  return order
})
  

Мне это нужно так, чтобы, если в магазине 20 тыс. заказов, он не проверял все заказы. только первый (самый новый из созданных)