我有要转换为数组的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, ", ");
});
任何帮助都非常感谢!
答案 0 :(得分:2)
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
会给出非常错误的答案。你能搞清楚为什么吗?
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 method与JavaScript'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() }
。