Проверить ключ на объекте JSON

Мы получаем строку JSON двумя способами:

"{"phoneNumber":[{"remove":["0099887769"]},{"add":["0099887765"]}]}"

Или

"{"phoneNumber":["0099887765"]}"

Мы должны конвертировать "{"phoneNumber":[{"remove":["0099887769"]},{"add":["0099887765"]}]}" в "{"phoneNumber":["0099887765"]}" способом

Есть ли способ написать JavaScript, чтобы определить, какой JSON имеет ключ «добавить», а какой нет.

Вы можете использовать метод Object.hasOwnProperty(key) или просто if (object.key){}

Ninad 11.11.2018 14:16

JSON - это текстовая нотация для обмена данными. (Подробнее здесь.) Если вы имеете дело с исходным кодом JavaScript, а не имеете дело с нить, вы имеете дело не с JSON. Итак, к тому времени, когда вы выполните эту проверку, вы больше не имеете дело с JSON, вы его проанализируете.

T.J. Crowder 11.11.2018 14:18
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
127
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

просто проверьте, является ли добавление собственностью верхнего уровня

if (obj['add']) {....}

если он существует, то if будет истинным, если нет, он вернет undefined, а if будет ложным,

если вы должны проверить это в массиве объектов, вы можете использовать ту же логику с методом find из прототипа массива

phoneNumber.find(obj => obj['add']);
add не является свойством объекта верхнего уровня JSON.
T.J. Crowder 11.11.2018 14:19

Вы можете проверить, существует ли ключ add, преобразовав JSON в массив:

Как преобразовать объект JSON в массив JavaScript

При этом вы можете проверить, существует ли ключ, проверив, не определен ли ключ:

obj["phonenumber"]["add"] != undefined
add не является свойством объекта верхнего уровня JSON.
T.J. Crowder 11.11.2018 14:19

используйте 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 "]}]}"

Indranil Banerjee 11.11.2018 17:28

@IndranilBanerjee - просто обобщите сказанное выше. Если вам нужно узнать имя одного свойства в оболочке (которое предполагает где-то проблемы с дизайном), вы можете получить его на Object.keys(parsed)[0].

T.J. Crowder 11.11.2018 17:36

На самом деле из стороннего приложения я получаю разные типы json.

Indranil Banerjee 11.11.2018 18:13

@IndranilBanerjee - Если ваш код не знает по природе вызываемого API, какова форма результата, это ошибка дизайна - в API, который вы вызываете.

T.J. Crowder 11.11.2018 18:15

На самом деле из стороннего приложения я получаю разные типы 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 / приложение.

Indranil Banerjee 11.11.2018 18:18

@IndranilBanerjee - Верно, опять же, вы бы сделали это, как в комментарии выше. К сожалению, вам приходится иметь дело с API, который заставляет вас это делать.

T.J. Crowder 11.11.2018 18:20

Есть ли способ найти «добавить», есть или нет в ключах json. для двух типов JSON: {"username": ["user1"], "password": ["pass @ 123"], "email": ["ind2‌ [email protected]"]} или {"phoneNumber" : [{"add": ["0099844465"], "remove": ["0099887769" ‌]}, {"add": ["00998877‌ 65"]}]}, чтобы я мог это сделать. Спасибо за поддержку.

Indranil Banerjee 11.11.2018 18:57

@IndranilBanerjee - Я рассказал вам, как это сделать несколько комментариев назад.

T.J. Crowder 12.11.2018 09:22

Вы можете использовать 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);

Другие вопросы по теме