Существует ли чистый способ преобразования таблицы lua (в виде строки) в массив javascript?(и наоборот) - PullRequest
0 голосов
/ 25 сентября 2019

РЕДАКТИРОВАТЬ: взять таблицу lua в виде строки и использовать javascript, чтобы преобразовать ее в массив javascript.Нет программирования на lua.

Так что таблица lua - это просто ассоциативный массив в другом формате.

    --LUA TABLE EXAMPLE
    {
    ["glow"] = true,
    ["xOffset"] = -287.99981689453,
    ["yOffset"] = -227.55575561523,
    ["anchorPoint"] = "CENTER",
    ["cooldownSwipe"] = true,
    ["customTextUpdate"] = "update",
    ["cooldownEdge"] = false,
    ["icon"] = true,
    ["useglowColor"] = false,
    ["internalVersion"] = 24,
    ["keepAspectRatio"] = false,
    ["animation"] = {
        ["start"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["main"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["finish"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
    }

Я искал некоторые функции или библиотеки javascript, чтобы сделать это, хотя яЯ только сталкивался с некоторыми библиотеками lua, чтобы преобразовать json в таблицу lua.Таблица lua всегда будет в строке.Существует ли способ сделать это?

Ответы [ 3 ]

1 голос
/ 25 сентября 2019

Это только частичное решение.Может произойти сбой в некоторых случаях, когда текст внутри строки соответствует синтаксису ключа.Но это может не беспокоить вас.

const lua = `
{
    ["glow"] = true,
    ["xOffset"] = -287.99981689453,
    ["yOffset"] = -227.55575561523,
    ["anchorPoint"] = "CENTER",
    ["cooldownSwipe"] = true,
    ["customTextUpdate"] = "update",
    ["cooldownEdge"] = false,
    ["icon"] = true,
    ["useglowColor"] = false,
    ["internalVersion"] = 24,
    ["keepAspectRatio"] = false,
    ["animation"] = {
        ["start"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["main"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["finish"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
    }
}`

const lua2json = lua => 
  JSON .parse (lua .replace (
    /\[([^\[\]]+)\]\s*=/g, 
    (s, k) => `${k} :`
  ) 
  .replace (/,(\s*)\}/gm, (s, k) => `${k}}`))

console .log (
  lua2json (lua)
)

Я не знал, хотите ли вы создать JSON или объект.Я выбрал последнее, но вы всегда можете удалить оболочку JSON.parse.

1 голос
/ 25 сентября 2019

Вы можете сделать это вручную, чтобы сделать его действительным JSON, а затем проанализировать его:

const luaStr = `{
    ["glow"] = true,
    ["xOffset"] = -287.99981689453,
    ["yOffset"] = -227.55575561523,
    ["anchorPoint"] = "CENTER",
    ["cooldownSwipe"] = true,
    ["customTextUpdate"] = "update",
    ["cooldownEdge"] = false,
    ["icon"] = true,
    ["useglowColor"] = false,
    ["internalVersion"] = 24,
    ["keepAspectRatio"] = false,
    ["animation"] = {
        ["start"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["main"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["finish"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
    }}`;

const result = luaStr  
  .replace(/\[|\]/g, '') // remove the brackets
  .replace(/=/g, ':') // replace the = with :
  .replace(/(\,)(?=\s*})/g, ''); // remove trailing commas
  
const parsed = JSON.parse(result);

console.log(result);
0 голосов
/ 25 сентября 2019

Вот то, что вы, возможно, не знаете, { ["someString"]: 2 } является допустимым JavaScript и будет оценивать в {someString: 2}, что является действительным JSON.Единственная проблема заключается в том, что его необходимо оценить, что означает использование eval (чего вы действительно никогда не должны делать, если можете этого избежать).

const luaStr = `{
    ["glow"] = true,
    ["xOffset"] = -287.99981689453,
    ["yOffset"] = -227.55575561523,
    ["anchorPoint"] = "CENTER",
    ["cooldownSwipe"] = true,
    ["customTextUpdate"] = "update",
    ["cooldownEdge"] = false,
    ["icon"] = true,
    ["useglowColor"] = false,
    ["internalVersion"] = 24,
    ["keepAspectRatio"] = false,
    ["animation"] = {
        ["start"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["main"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
        ["finish"] = {
            ["duration_type"] = "seconds",
            ["type"] = "none",
        },
    }}`;
    
const jsonString = luaStr.replace(/\] = /g, ']: ');
const jsonObj = eval(`(${jsonString})`);

console.log(jsonObj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...