Преобразование массива в правильную строку JSON без использования JSON .stringify? - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь написать функцию, которая принимает некоторый объект, например число, строку, список или карту (пар ключ-значение); и возвращает действительное JSON представление этого ввода в виде строки.

Я уже настроил другие json кодировщики для простых чисел и строковых входов:

Input => Output 
a number with value 123 => 123 (string)
a string with value abc => "abc" (string)

Но у меня возникают проблемы с преобразованием массива, например [1, "2", 3]

Input => Output 
1,2,three array => [1,2,"three"] (string) 

Вот мой текущий код:

var my_json_encode = function(input) {

  if(typeof(input) === "string"){
      return '"'+input+'"'
  }
  if(typeof(input) === "number"){
      return `${input}`
  }

  //This is causing my issue
  if(Array.isArray(input)) {
      console.log(input)
  }

Я мог бы просто добавить и вернуть JSON .stringify (вход), чтобы изменить его, но я не хочу использовать это. Я знаю, что могу создать какое-то рекурсивное решение, так как у меня есть базовые случаи для чисел и строк. Я заблокирован по этому вопросу, и любая помощь будет оценена

Редактировать: Таким образом, решение, которое было предоставлено ниже в разделе ответов! Спасибо:)

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Для массивов используйте рекурсивный подход с элементами.

const
    json_encode = (input) => {
        if (typeof input === "string") return `"${input}"`;
        if (typeof input === "number") return `${input}`;
        if (Array.isArray(input)) return `[${input.map(json_encode)}]`;
    };

console.log(json_encode([1, 'foo', [2, 3]]));
console.log(JSON.parse(json_encode([1, 'foo', [2, 3]])));
1 голос
/ 27 апреля 2020

У вас уже есть функция, которая преобразует скалярные значения в значения json.

Итак, вы можете вызвать эту функцию для всех членов массива (например, используя https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/map), а затем присоедините его (https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/join) и добавьте '[' и ']' к результирующей строке

PS: этот подход будет работать и в ситуациях, когда у вас есть массив массивов

Пример реализации:

var my_json_encode = function(input) {

   if(typeof(input) === "string"){
     return '"'+input+'"'
   }
   if(typeof(input) === "number"){
     return `${input}`
   }

   if(Array.isArray(input)) {
      const formatedArrayMembers = input.map(value => my_json_encode(value)).join(',');
      return `[${formatedArrayMembers}]`;
   }
}
...