Мы получаем строку JSON двумя способами:
"{"phoneNumber":[{"remove":["0099887769"]},{"add":["0099887765"]}]}"
Или
"{"phoneNumber":["0099887765"]}"
Мы должны конвертировать "{"phoneNumber":[{"remove":["0099887769"]},{"add":["0099887765"]}]}" в "{"phoneNumber":["0099887765"]}" способом
Есть ли способ написать JavaScript, чтобы определить, какой JSON имеет ключ «добавить», а какой нет.
JSON - это текстовая нотация для обмена данными. (Подробнее здесь.) Если вы имеете дело с исходным кодом JavaScript, а не имеете дело с нить, вы имеете дело не с JSON. Итак, к тому времени, когда вы выполните эту проверку, вы больше не имеете дело с JSON, вы его проанализируете.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


просто проверьте, является ли добавление собственностью верхнего уровня
if (obj['add']) {....}
если он существует, то if будет истинным, если нет, он вернет undefined, а if будет ложным,
если вы должны проверить это в массиве объектов, вы можете использовать ту же логику с методом find из прототипа массива
phoneNumber.find(obj => obj['add']);
add не является свойством объекта верхнего уровня JSON.
Вы можете проверить, существует ли ключ add, преобразовав JSON в массив:
Как преобразовать объект JSON в массив JavaScript
При этом вы можете проверить, существует ли ключ, проверив, не определен ли ключ:
obj["phonenumber"]["add"] != undefined
add не является свойством объекта верхнего уровня JSON.
используйте let obj = JSON.parse('{"phoneNumber":[{"remove":["0099887769"]},{"add":["0099887765"]}]}'), чтобы преобразовать его в объект.
затем выполните итерацию, выберите значение и вставьте его в новый объект
Когда вы анализируете JSON, у вас будет массив с двумя записями (каждый объект), если это первый стиль, или массив с одной записью, которая является строкой. Так:
function handle(theJSON) {
let parsed = JSON.parse(theJSON);
if (typeof parsed.phoneNumber[0] === "object") {
parsed.phoneNumber = [parsed.phoneNumber.find(o => o.add).add[0]];
}
console.info(parsed);
}
Живой пример:
function handle(theJSON) {
let parsed = JSON.parse(theJSON);
if (typeof parsed.phoneNumber[0] === "object") {
parsed.phoneNumber = [parsed.phoneNumber.find(o => o.add).add[0]];
}
console.info(parsed);
}
handle('{"phoneNumber":[{"remove":["0099887769"]},{"add":["0099887765"]}]}');
handle('{"phoneNumber":["0099887765"]}');Или, если вам нужна версия ES5:
function handle(theJSON) {
var parsed = JSON.parse(theJSON);
if (typeof parsed.phoneNumber[0] === "object") {
parsed.phoneNumber = [parsed.phoneNumber.find(function(o) { return o.add; }).add[0]];
}
console.info(parsed);
}
Мы можем получить json: "{" email ": [{" remove ": [" [email protected] "]}, {" add ": [" indra2121 @ g mail.com "]}]}"
@IndranilBanerjee - просто обобщите сказанное выше. Если вам нужно узнать имя одного свойства в оболочке (которое предполагает где-то проблемы с дизайном), вы можете получить его на Object.keys(parsed)[0].
На самом деле из стороннего приложения я получаю разные типы json.
@IndranilBanerjee - Если ваш код не знает по природе вызываемого API, какова форма результата, это ошибка дизайна - в API, который вы вызываете.
На самом деле из стороннего приложения я получаю разные типы json. Пример. Чтобы изменить номер телефона, я получаю json: '{"phoneNumber": [{"add": ["0099844465"], "remove": ["0099887769"]}, {"add": ["0099887 765 "]}]} 'для обновления по электронной почте: {" email ": [{" remove ": [" [email protected] "]}, {" add ": [" indra2121 @ gm ail.com "]} ]} "Для добавления пользователя: {" username ": [" user1 "]," password ": [" pass @ 123 "]," email ": [" ind2 [email protected] "]} Мне нужно определить операции и создайте общий json, например: {"attribute": "value"} Я не контролирую сторонний API / приложение.
@IndranilBanerjee - Верно, опять же, вы бы сделали это, как в комментарии выше. К сожалению, вам приходится иметь дело с API, который заставляет вас это делать.
Есть ли способ найти «добавить», есть или нет в ключах json. для двух типов JSON: {"username": ["user1"], "password": ["pass @ 123"], "email": ["ind2 [email protected]"]} или {"phoneNumber" : [{"add": ["0099844465"], "remove": ["0099887769" ]}, {"add": ["00998877 65"]}]}, чтобы я мог это сделать. Спасибо за поддержку.
@IndranilBanerjee - Я рассказал вам, как это сделать несколько комментариев назад.
Вы можете использовать some, чтобы вернуть истину / ложь, если «добавить» является свойством любого объекта в массиве. Вот общее решение:
const json = '{"phoneNumber":[{"remove":["0099887769"]},{"add":["0099887765"]}]}';
const data = JSON.parse(json);
function checkForKey(data, { arrayKey, searchKey }) {
return data[arrayKey].some(obj => obj[searchKey]);
}
const hasAdd = checkForKey(data, {arrayKey: 'phoneNumber', searchKey: 'add' });
console.info(hasAdd);Вы можете сделать это, используя цикл для..в и проверку hasOwnProperty, наконец, вставив только phoneNumbers с индексом add. Надеюсь это поможет :)
const expected = {'phoneNumber':[]};
let str = '{"phoneNumber":[{"add":["0099844465"],"remove":["0099887769"]},{"add":["0099887765"]}]}';
const st_obj = JSON.parse(str);
for (var k in st_obj['phoneNumber']) {
if (st_obj['phoneNumber'][k].hasOwnProperty('add')) {
expected['phoneNumber'].push(st_obj['phoneNumber'][k]['add']);
}
}
console.info(expected);
Вы можете использовать метод
Object.hasOwnProperty(key)или простоif (object.key){}