捕获类似于JSON的代码中的值

时间:2016-09-14 03:08:55

标签: javascript regex

我试图为一个游戏(维多利亚二世)创建一个工具,保存游戏(整个保存游戏没有这种格式,只有我打算使用的部分,剩下的保存维多利亚二世有这种格式的游戏现在没有任何重要性:

 AAA = {
    B = {
        random_text = 1000.00
        another_one = 400.00
    }
    C= { 
        no_importance = 222
    }
    D = {
        random_text = 5.00
        another_one = 10.00
    }

 }

该工具如何运作?该工具将计算国家AAA的GDP(有100个国家,首先我想计算AAA的GDP,但我想计算每一个。每个国家的代码是大写的三个字母),B参数是国内生产的一些商品(random_text和another_one),C参数没有重要性,因此,工具会忽略它。 D参数是某些商品的价格(在这种情况下,random_text和another_one,如果没有错误,则有20种商品)。因此,该工具(在JavaScript中)必须将该国家的商品生产与每种商品的价格相乘,然后与每个国家的GDP进行对比。问题是:我如何用JavaScript做到这一点?我试图使用regexp but I'm always failing,代码捕获参数C并使工具失败。对于每个国家,我想在表格中插入其名称及其各自的GDP。

注意:在上面的链接中,有关于该工具的工作的更多评论。

1 个答案:

答案 0 :(得分:0)

假设您显示的格式是可靠的,您可以通过对.replace()的一些调用快速转换为JSON,然后解析该JSON并根据需要处理生成的对象。

我不确定我是否理解你对GDP计算的看法,但我认为你的意思是AAA的GDP将是每个B值乘以其相应D值的总和,即1000.00 * 5.00 + 400.00 * 10.00 = 9000。

var input = ' /* your input here */  ';

var json = '{'
         + input.replace(/([^\s]+)\s*=/g,'"$1":')
                .replace(/([^{\s])\n(\s*[^{}])/g,'$1,\n$2')
                .replace(/,(\s*})/g,'$1')
         + '}';

var obj = JSON.parse(json);

var output = Object.keys(obj).map(function(v) {
  return {
    country: v,
    gdp: Object.keys(obj[v].B).reduce(function(p, c) {
      return p + obj[v].B[c] * obj[v].D[c];
    }, 0)
  };
});

运行上述内容后,output变量将是一个对象数组,其中包含以下格式的详细信息:

[ { "country": "AAA", "gdp": 9000 }, //etc. ]

展开以下内容并运行它以查看它与三个国家/地区合作:

var input = `AAA = {
    B = {
        random_text = 1000.00
        another_one = 400.00
    }
    C= { 
        no_importance = 222
    }
    D = {
        random_text = 5.00
        another_one = 10.00
    }
 }
 BBB = {
    B = {
        random_text = 111.00
        another_one = 222.00
    }
    C= { 
        no_importance = 222
    }
    D = {
        random_text = 3.00
        another_one = 4.00
    }
 }
 CCC = {
    B = {
        x = 10.0
        y = 20.0
        z = 30.0
    }
    C= { 
        no_importance = 222
    }
    D = {
        x = 1.00
        y = 2.00
        z = 3.00
    }
 }`;

var json = '{'
         + input.replace(/([^\s]+)\s*=/g,'"$1":')
                .replace(/([^{\s])\n(\s*[^{}])/g,'$1,\n$2')
                .replace(/,(\s*})/g,'$1')
         + '}';

var obj = JSON.parse(json);

var output = Object.keys(obj).map(function(v) {
  return {
    country: v,
    gdp: Object.keys(obj[v].B).reduce(function(p, c) {
      return p + obj[v].B[c] * obj[v].D[c];
    }, 0)
  };
});

console.log(output);