Как изменить JSON на определенный формат запроса SQL в javascript?

У меня есть требование изменить JSON на JSON, имеющий значения в формате запроса SQL. Чтобы лучше объяснить.

{
    "Assets": {
        "ASSOCIATES_NAME": ["David", "Philip"],
        "CAR_NAME": ["Verron"]
    }
  , "Product":{"SELLER_NAME": ["XXXXX"]}
}

Результат должен иметь значения json в виде запроса sql, оставляя ключи как есть. Таким образом, результирующий запрос будет таким:

{
  Assets: "(ASSOCIATES_NAME = 'David' OR ASSOCIATES_NAME = 'Philip') AND CAR_NAME = 'Verron'", 
  Product: "SELLER_NAME = 'XXXXX'"
}

Я пробовал что-то, но я не мог понять это хорошо. Ниже это:

console.info(Object.entries(a).map(x => {return {
  [x[0]]: `${Object.keys(x[1])} = '${Object.values(x[1])}'`,
  }}))

Однако мне все еще нужно выяснить, как сгруппировать отдельные значения массива. Любое элегантное решение на основе ES6 для этого? Пожалуйста, люди, помогите мне в этом. ТИА

Рассмотреть строку JSON? JSON.parse. Кроме того, я не уверен, зачем вам нужно регулярное выражение в этой ситуации.

evolutionxbox 23.12.2020 12:11

Да, я разобрал строку. однако проблема заключается в значениях... Я пробовал множество способов, таких как Object.entries, значения и т. д.

Bratty Neal 23.12.2020 12:13

Пожалуйста, поделитесь этими предыдущими попытками. Лучше всего сделать простой минимально воспроизводимый пример каждой попытки.

evolutionxbox 23.12.2020 12:14

Просто предупреждение: будьте очень осторожны с атаками SQL Injection при обработке необработанных SQL-запросов во внешнем интерфейсе.

Shell Code 23.12.2020 12:19

@evolutionxbox поделился. пожалуйста, взгляните

Bratty Neal 23.12.2020 12:23
Поведение ключевого слова "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
5
110
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот один из способов сделать это, используя Array.reduce для перебора свойств внешнего объекта и Array.map для внутренних свойств объекта для генерации выражений OR и AND:

const json = `{
    "Assets": {
        "ASSOCIATES_NAME": ["David", "Philip"],
        "CAR_NAME": ["Verron"]
    }
  , "Product":{"SELLER_NAME": ["XXXXX"]}
}`
const params = JSON.parse(json);

const whereItems = Object.entries(params)
  .reduce((c, [k, v]) => {
    c[k] = Object.entries(v)
      .map(([param, value]) => '(' + value.map(v => param + " = '" + v + "'").join(' OR ') + ')')
      .join(' AND ');
    return c;
  }, {});
console.info(whereItems);

Обратите внимание, что это создает ненужные () вокруг одиночных сравнений (например, (SELLER_NAME = 'XXXXX')), если вы действительно хотите избавиться от них, просто обусловите добавление этих символов value.length > 1.

(Вы можете использовать строку шаблона, чтобы избежать обратной косой черты?)

evolutionxbox 23.12.2020 12:25

@evolutionxbox действительно. это намного чище; Я отредактировал его. спасибо.

Nick 23.12.2020 12:26

О боже мой. Большое спасибо @Ник. Вы спасли мой день. Только что внес небольшое изменение, предложенное @evolutionxbox ${value.map(v => param + " = '" + v + "'").join(" OR ")}

Bratty Neal 23.12.2020 12:54

Да .... @Nick, что ты думаешь, когда значение не массив, а просто строка, если в случае одного значения. как ["Веррон"] будет просто "Веррон"

Bratty Neal 23.12.2020 12:57

Вам нужно будет отредактировать код, который имеет дело с value, чтобы проверить, была ли это строка или массив, возможно, проще всего просто превратить его в массив, если это не так.

Nick 23.12.2020 13:06

проголосуйте за ответ @nik, вот еще один способ для начинающих.

f3 = function(key, arr){
var result = arr.map(function(e) {
  return(`${key}='${e}'`)
})
if (result.length > 1)
  return(`(${result.join(' AND ')})`)
else
  return(result)
}

f2 = function(json) {
  var result = []
  for(const key in json) {
    result.push(f3(key, json[key]))
  }
  return(result.join(' OR '))
}

f = function(json) {
  var result = {}
  for(const key in json) {
    result[key] = f2(json[key])
  }
  return(result)
}

вызовите f над своим json

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