#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/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:
Я не уверен, чего вы пытаетесь достичь. Насколько я понимаю, это:
- Вы делаете запрос API для получения списка заказов.
- Вы хотите отфильтровать этот список для заказов из Канады без номера телефона.
- Вы хотите отредактировать отфильтрованный список с фиктивными номерами телефонов и перенести эти изменения на сервер.
Я мало что знаю о том, как написан 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
Кроме того, я понял, что вы можете получить конкретный заказ по идентификатору
/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 тыс. заказов, он не проверял все заказы. только первый (самый новый из созданных)