2016-11-09 81 views
1

我有像"[4]Motherboard, [25]RAM"括号中的数字不同的字符串我怎么能这样的字符串转换成JSON阵列(保留两个ID和值)是这样的:转换字符串成JSON数组索引括号

{"data":[ 
    {"id":"4","item":"Motherboard"}, 
    {"id":"25","item":"RAM"} 
]}; 

我尝试使用split(",")来创建数组,但我真的无法找到如何在这种情况下获取内部数据。

+4

去与_obvious_解决方案,让我们知道你有没有试过.. – Rayon

回答

1
function toArray(string) { 
    return { 
     data: string.split(",").map(function(str) { 
      str = str.trim(); 
      return { 
       id: str.substring(1, str.indexOf("]")), 
       item: str.substring(str.indexOf("]") + 1), 
      }; 
     }), 
    }; 
} 
2

这里有一种方法可以做到这一点。模式\[(\d+?)\](.+)的工作原理是这样的:

  1. (…)是一个捕获组。只是意味着括号内的任何匹配都是结果中的一个标记。
  2. \d意味着一个数字
  3. \d+指一个数字,一次或多次
  4. \d+?指一个数字,一次或多次,但模式匹配别的东西之前尽可能少的不可能性。
  5. .+表示任何角色,一次或多次。

[]在正则表达式中有特殊的含义,所以如果你真的想自己匹配的字符,你需要逃生他们像这样\[\]

当使用字符串定义正则表达式时,双反斜杠\\只是一个JS怪异的东西,而不是使用/literal/。只有两种说法相同的方法。

有足够的资源来学习正则表达式的语法,http://regex101.com是一个模式和实验的好地方。

var input = "[4]Motherboard, [25]RAM"; 
 
var pattern = '\\[(\\d+?)\\](.+)'; 
 
var result = input.split(',').map(function (item) { 
 
    var matches = item.match(new RegExp(pattern)); 
 
    return {id: matches[1], val: matches[2]}; 
 
}); 
 

 
console.log(result)

+0

良好的人,但你能解释一下正则表达式一点?我知道这是一个简单的例子,但仍然... –

2

你可以使用正则表达式,这需要数和字符串,并将其指定为属性的对象。

var string = "[4]Motherboard, [25]RAM", 
 
    data = string.split(', ').map(function (a) { 
 
     var p = a.match(/^\[(\d+)\](.+)$/); 
 
     return { id: p[1], item: p[2] }; 
 
    }); 
 
console.log(data);

+0

这不符合问题中的格式。你有'{“4”:“主板”}',但它要求'{“id”:“4”,“item”:“主板”}'。 – afuous

+0

对不起,现在应该按需要工作。 –