#javascript #json #react-native
#javascript #json #react-native
Вопрос:
Я пытаюсь объединить два JSON в один, но не могу. Я попытался преобразовать их в строку с помощью stringify, объединить их и повторить JSON с помощью parse … Но это не работает.
Это мой код (ordersByCustomerId возвращает объект JSON):
fetchMyOrders: (dispatch) => {
dispatch({ type: types.FETCH_CART_PENDING });
WooWorker.ordersByCustomerId(11, 40, 1)
.then((response) => {
var data = response;
WooWorker.ordersByCustomerId(154, 40, 1).then((response) => {
// here "data" should be the union of the two "response" then dispatch it
dispatch({
type: types.FETCH_MY_ORDER,
data,
});
})
})
.catch((err) => { });
}
ordersByCustomerId возвращает это, и я хочу объединить два одинаковых файла в один.
С уважением.
Редактировать:
Итак, если у меня есть два JSON, подобных этому, как я могу их объединить?
[{
"id": 1523,
"parent_id": 0,
"number": "1523",
"order_key": "wc_order_",
"created_via": "rest-api",
"version": "4.0.0",
"status": "processing",
"currency": "EUR",
"date_created": "2020-09-03T10:24:44",
"date_created_gmt": "2020-09-03T08:24:44",
"date_modified": "2020-09-03T10:24:45",
"date_modified_gmt": "2020-09-03T08:24:45",
"discount_total": "0.00",
"discount_tax": "0.00",
"shipping_total": "0.00",
"shipping_tax": "0.00",
"cart_tax": "26.33",
"total": "151.72",
"total_tax": "26.33",
"prices_include_tax": true,
"customer_id": 11,
"customer_ip_address": "",
"customer_user_agent": "",
"customer_note": "",
"billing": {
"first_name": "name",
"last_name": "last name",
"company": "",
"address_1": "address",
"address_2": "",
"city": "city",
"state": "M",
"postcode": "12345",
"country": "ES",
"email": "email@email.com",
"phone": "(34) 123123123"
},
"shipping": {
"first_name": "first name",
"last_name": "last name",
"company": "",
"address_1": "address",
"address_2": "",
"city": "city",
"state": "state",
"postcode": "12345",
"country": ""
},
"payment_method": "cod",
"payment_method_title": "cod",
"transaction_id": "",
"date_paid": null,
"date_paid_gmt": null,
"date_completed": null,
"date_completed_gmt": null,
"cart_hash": "",
"meta_data": [
],
"line_items": [{
"id": 469,
"name": "test product",
"product_id": 1197,
"variation_id": 0,
"quantity": 4,
"tax_class": "",
"subtotal": "125.39",
"subtotal_tax": "26.33",
"total": "125.39",
"total_tax": "26.33",
"taxes": [{
"id": 3,
"total": "26.33157",
"subtotal": "26.33157"
}],
"meta_data": [
],
"sku": "1234",
"price": 31.3471075
}],
"tax_lines": [{
"id": 471,
"rate_code": "ES-IVA (CLIENTE FINAL)-1",
"rate_id": 3,
"label": "IVA (cliente final)",
"compound": false,
"tax_total": "26.33",
"shipping_tax_total": "0.00",
"rate_percent": 21,
"meta_data": [
]
}],
"shipping_lines": [{
"id": 470,
"method_title": "Envío gratuito",
"method_id": "free_shipping",
"instance_id": "2",
"total": "0.00",
"total_tax": "0.00",
"taxes": [{
"id": 3,
"total": "0",
"subtotal": ""
}],
"meta_data": [
]
}],
"fee_lines": [
],
"coupon_lines": [
],
"refunds": [
],
"currency_symbol": "€",
"_links": {
"self": [{
"href": ""
}],
"collection": [{
"href": ""
}],
"customer": [{
"href": ""
}]
}
}]
Комментарии:
1. JSON !== объект javascript, JSON — это текстовая нотация для обмена данными. Если вы имеете дело с исходным кодом JavaScript, а не со строкой, вы имеете дело не с JSON.
Ответ №1:
Похоже, вы на самом деле имеете дело с объектами JavaScript, а не с JSON. Это может быть немного запутанным в JavaScript. Вы можете обрабатывать их аналогичным образом, поскольку их легко перемещать между двумя представлениями. Важная вещь, о которой упоминал Кшиштоф Кшешевский в комментариях, заключается в том, что JSON — это текстовый формат для обмена данными.
Следующий допустимый JSON:
{"key": "val"}
Это также допустимый объект JavaScript. В результате при отправке JSON по HTTP-запросу мы часто преобразуем ответ в объект JavaScript, чтобы упростить работу с ним во внешнем интерфейсе (или бэкэнде, если вы используете nodejs).
В данном случае это выглядит так, как будто это делается для вас, так что на самом деле у вас есть два объекта JavaScript, которые вы хотите объединить вместе. Это можно сделать с помощью Object.assign. Например:
let objOne = { keyOne: "val1" };
let objTwo = { keyTwo: "val2" };
let result = {};
Object.assigns(result, objOne, objTwo);
console.log(result);
// { keyOne: "val1", keyTwo: "val2" }
Для этого берется целевой объект, а затем несколько исходных объектов и присваиваются свойства целевому объекту. Это делается в том порядке, в котором вы передаете целевые объекты функции, это означает, что если у objTwo был ключ с именем «KEYone» со значением «val3», вы бы получили следующее:
{ keyOne: "val3", keyTwo: "val2" }
Полезно отметить, что это не «глубокое» слияние. Он будет выполнять только свойства верхнего уровня. Если вы хотите выполнить глубокое слияние, вам нужно либо выполнить цикл по соответствующему объекту, либо посмотреть на использование функции из библиотеки, такой как функция слияния из Lodash.
Комментарии:
1. Привет, Эллиот, спасибо за объяснение. Я думаю, что понимаю это немного лучше… Но я новичок в JavaScript и немного теряюсь… Я отредактировал основной пост с помощью примера JSON, который я получаю… Большое вам спасибо за помощь 🙂
2. Привет @pmj, я думаю, что мое предложение сработает, хотя вы, вероятно, хотите глубокое слияние, используя что-то вроде Lodash, как я предлагаю в конце. Имейте в виду, что оба ваших объекта JSON находятся внутри массива, поэтому вы захотите извлечь их из массива и выполнить слияние (или выполнить итерацию по массивам и создать новый массив объединенных объектов).