Как преобразовать хэш Ruby в объект Javascript с неквотируемыми значениями?

Я хочу вывести хэш Ruby как объект JS, но для некоторых значений хэша они нужны без кавычек, т. е. код JS. Например (что-то вроде) Этот Рубин:

{ foo: proc { 'someJavascriptFn()' } }.to_json

Выведет это JS:

{ foo: someJavascriptFn() }

Возможно ли что-то подобное без латания procили hash?

1 ответ

  1. Да, это возможно, но вам нужно будет построить JSON самостоятельно:

    hash = {
      foo: proc { 'someJavascriptFn()' },
      bar: 42,
      baz: "Hello, world!"
    }
    
    content = hash.each_with_object([]) do |(k, v), acc|
      acc << ("#{k}: " << (Proc === v ? v.() : v.inspect))
    end.join(",\n")
    #⇒ "foo: someJavascriptFn(),\nbar: 42,\nbaz: \"Hello, world!\""
    puts "{#{content}}"
    #⇒ {foo: someJavascriptFn(),
    #   bar: 42,
    #   baz: "Hello, world!"}
    

    Обратите внимание, что может потребоваться реализовать рекурсивный вызов этой функции, если входные данные содержат вложенные структуры.