表html到数组

时间:2017-10-13 13:31:16

标签: javascript jquery arrays json

我有要转换为数组的JSON内容。 该JSON内容是具有单元格值的HTML表。那些我想要转换成单个数组的单元格,所以我可以在我的项目中进一步使用它。

我正在努力将这些单元格值转换为数组。

所以我拥有的是:

JSON(非常小的代码段):

{
    "textpage": {
        "content": "<table width=\"512\">\r\n<tbody>\r\n<tr>\r\n<td width=\"64\">8211</td>\r\n<td width=\"64\">8231</td>\r\n<td width=\"64\">1309</td>\r\n<td width=\"64\">1333</td>\r\n<td width=\"64\">1011</td>\r\n<td width=\"64\">1035</td>\r\n<td width=\"64\">1062</td>\r\n<td width=\"64\">1087</td>\r\n</tr>\r\n<tr>\r\n<td>8212</td>\r\n<td>8232</td>\r\n<td>1311</td>\r\n<td>1334</td>\r\n<td>1012</td>\r\n<td>1036</td>\r\n<td>1063</td>\r\n<td>1091</td>\r\n</tr>\r\n<tr>\r\n<td>8218</td>\r\n<td>8233</td>\r\n<td>1312</td>\r\n<td>1335</td>\r\n<td>1013</td>\r\n<td>1037</td>\r\n<td>1064</td>\r\n<td>1092</td>\r\n</tr>\r\n<tr>\r\n<td>8219</td>\r\n<td>8239</td>\r\n<td>1313</td>\r\n<td>1336</td>\r\n<td>1014</td> 
///////// and whole lot more stuff //////////
    },

jQuery的:

function getPostalcode(){

 var url = 'link-to-text-page';
 $.getJSON(url+'?format=json', function(data){
   var content = data.textpage.content,
       codes = [];

   $(content + 'tr td').each(function(){
     var code = $(this).text();
     codes.push(code)
   });
  codes.join('');   
  console.log(codes)
 });
}

该console.log返回:

Array [ "   8211 8231 1309 1333 1011 1035 10…" ]

我需要它像

一样阅读
Array ["8211,8231,1309,1333,1011,1035,10…" ]

问题是这些单元格值是文本。那么如何在变量/数组中转换这些值?

我尝试过这样的事情:

var code = $(this).text();
parsed = JSON.parse(code)

或者:

var code = $(this).text();
$(code).text(function(i, val) {
  return val.replace(/,/g, ", ");
});

任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:2)

选项1:快速入侵正则表达式

let html = data.textpage.content;
let values = html.match(/<td[^>]*>([^<]+)/g)
                 .map( s => s.replace(/<.+?>/,'') );
// [ '8211', '8231', '1309', '1333', '1011', '1035', '1062', '1087', … ]

或者,如果你想要一组数字:

let values = html.match(/<td[^>]*>([^<]+)/g)
                 .map( s => s.replace(/<.+?>/,'')*1 );
// [ 8211, 8231, 1309, 1333, 1011, 1035, 1062, 1087, … ]

编辑:这是一个更优雅的正则表达式解决方案:

let values = html.match(/[^<>]+(?=<\/td>)/g).map( s => s*1 );
// [ 8211, 8231, 1309, 1333, 1011, 1035, 1062, 1087, … ]

let values = html.match(/[^<>]+(?=<\/td>)/g).map(parseFloat);
// [ 8211, 8231, 1309, 1333, 1011, 1035, 1062, 1087, … ]

注意:在上面使用parseInt代替parseFloat会给出非常错误的答案。你能搞清楚为什么吗?

选项2:jQuery HTML解析和选择

let html = data.textpage.content;
let values = $(html).find('td').map((_,td) => $(td).text()*1 );
// [ 8211, 8231, 1309, 1333, 1011, 1035, 1062, 1087, … ]

请注意,jQuery's map methodJavaScript's Array map method不同;特别是,jQuery方法首先提供值的索引,而Array方法提供索引秒。这就是jQuery版本具有(_,td)的原因:在获取我们关心的参数之前,我通过将其分配给名为_的变量来“扔掉”索引。

此外,如果您不熟悉上面提到的lambda语法x => someCode()(a,b,c) => someCode(),请注意它们等同于function(x){ return someCode() }function(a,b,c){ return someCode() }