Глубокая копия JSON упрощен
Пытаюсь скопировать объект json, но когда в нем есть строка, мне нужно всего несколько пар ключ / значение и скопировать его в другой объект json (упрощенно); Данные в JSON это что-то вроде этого
{ __createdAt: "2018-07-30T08:19:32.523Z",
orderid: '12345',
refund: null,
order_verified: null,
in_process: null,
location_id: null,
userInfo: '{"countrySelect":"DE","postalCode":"64289","ShippingCountry":"Germany","City":"Darmstadt","GooglePlace":"Darmstadt Germany","ShippingRegion":"Hesse","CustomerEmail":"myemail@gmail.com"}',
payment: null,
shippingInfo: 1437,
taxInfo: 0,
orderTotal: 5712,
order_weight: 0,
order_notes: '' }
Результат, который я пытаюсь достичь после копирования, выглядит примерно так.
{ __createdAt: "2018-07-30T08:19:32.523Z",
orderid: '12345',
refund: null,
order_verified: null,
in_process: null,
location_id: null,
countrySelect:"DE",
ShippingCountry:"Germany",
City:"Darmstadt",
CustomerEmail:"myemail@gmail.com",
payment: null,
shippingInfo: 1437,
taxInfo: 0,
orderTotal: 5712,
order_weight: 0,
order_notes: '' }
Я не знаю, какие данные будут поступать из БД, но всякий раз, когда она содержит строку, я могу жестко закодировать ее, чтобы получить конкретные значения из строки в json. Пробовал глубокое копирование, но не смог сделать это правильно. Не то чтобы я не пытался сделать это, но не мог придумать способ сделать его более общим, а не жестко закодированным. Любая помощь будет оценена.
1 ответ
Поскольку вы говорите, что глубина будет только на один уровень, вам, так сказать, не нужна "глубокая" копия. Звучит так, как будто вам нужно только проверить строки, чтобы увидеть, если они JSON.parse
возможность, и если да, то включить их пары ключ / значение в объект.
Если это так, то простой try/catch поможет вам. Вы также можете добавить еще одну проверку после JSON.parse
чтобы проверить, что выходные данные разбора на самом деле являются объектом, или отфильтровать определенные значения ключей и т. д.
const src = {
__createdAt: "2018-07-30T08:19:32.523Z", orderid: '12345', refund: null, order_verified: null, in_process: null, location_id: null,
userInfo: '{"countrySelect":"DE","postalCode":"64289","ShippingCountry":"Germany","City":"Darmstadt","GooglePlace":"Darmstadt Germany","ShippingRegion":"Hesse","CustomerEmail":"myemail@gmail.com"}',
payment: null, shippingInfo: 1437, taxInfo: 0, orderTotal: 5712, order_weight: 0, order_notes: ''
}
function copyExpand(target, source) {
for (let k in source) {
if (typeof source[k] === 'string') {
try {
let json = JSON.parse(source[k]);
copyExpand(target, json);
} catch (e) {
target[k] = source[k];
}
} else target[k] = source[k];
}
}
const tgt = {};
copyExpand(tgt, src);
console.log(tgt);