4

我有一个看起来像这样的字符串:

<tr><td>Date</td><td>Value</td></tr>
<tr><td>2013-01-01</td><td>231.198</td></tr>
<tr><td>2013-02-01</td><td>232.770</td></tr>
<tr><td>2013-03-01</td><td>232.340</td></tr>
<tr><td>2013-04-01</td><td>231.485</td></tr>
<tr><td>2013-05-01</td><td>231.831</td></tr>
<tr><td>2013-06-01</td><td>232.944</td></tr>
<tr><td>2013-07-01</td><td>233.318</td></tr>

...当然本质上是一张桌子。

我想将此字符串动态转换为包含 2 个数组的数组。日期之一,值之一。

[编辑于] 带有日期和值的对象数组也可以工作。

4

5 回答 5

4

以下::

var input = // your string

var output = $(input).slice(1).map(function(i,el) {
    var tds = $(el).find("td");
    return { "date" : tds.eq(0).text(), "value" : tds.eq(1).text() };
}).get();

...将以这种格式返回一个对象数组:

[{"date":"2013-01-01","value":"231.198"}, {"date":"2013-02-01","value":"232.770"}, ... ]

如果您希望每个value都被视为一个数字,您可以像这样转换它:

    return { "date" : tds.eq(0).text(), "value" : +tds.eq(1).text() };
    // add the unary plus operator ---------------^

那么结果将是:

[{"date":"2013-01-01","value":231.198}, {"date":"2013-02-01","value":232.77}, ... ]
于 2013-09-13T21:51:33.677 回答
3

虽然您已经接受了答案,但我想我会发布一个简单的 JavaScript 解决方案(尽管主要是因为我花了时间研究它,在 Barmar 指出您愿意并且能够使用 jQuery 之前):

function cellContents(htmlStr, what) {
    var _table = document.createElement('table');
    _table.innerHTML = htmlStr;
    var rows = _table.getElementsByTagName('tr'),
        text = 'textContent' in document ? 'textContent' : 'innerText',
        cells,
        matches = {};
    for (var w = 0, wL = what.length; w < wL; w++) {
        matches[what[w]] = [];
        for (var r = 1, rL = rows.length; r < rL; r++) {
            cells = rows[r].getElementsByTagName('td');
            matches[what[w]].push(cells[w][text]);
        }
    }
    return matches;
}

var str = "<tr><td>Date</td><td>Value</td></tr><tr><td>2013-01-01</td><td>231.198</td></tr><tr><td>2013-02-01</td><td>232.770</td></tr><tr><td>2013-03-01</td><td>232.340</td></tr><tr><td>2013-04-01</td><td>231.485</td></tr><tr><td>2013-05-01</td><td>231.831</td></tr><tr><td>2013-06-01</td><td>232.944</td></tr><tr><td>2013-07-01</td><td>233.318</td></tr>";

console.log(cellContents(str, ['dates', 'values']));

JS 小提琴演示

于 2013-09-13T22:05:01.917 回答
1

对于纯 JavaScript 解决方案,您可以尝试这样的事情(假设 str 保存您的字符串):

var arrStr = str.replace(/<td>/g, "").replace(/<tr>/g, "").split("</td></tr>");
var arrObj = [];
var arrData

for (var i = 1; i < arrStr.length - 1; i++) {
    arrData = arrStr[i].split("</td>");
    arrObj.push({ Date: arrData[0], Value: arrData[1] })
}

这是一个强力的字符串替换/拆分,但最后arrObj会有对象数组。

于 2013-09-13T22:06:09.487 回答
0

如果它是一个有效的 html 表结构,则将其包装在表标签之间,并使用 jquery 对其进行解析。然后使用 jquery 的选择器来查找列。

例如像这样的东西(伪代码,没试过)

table = $(yourTableString);
dates  =  table.find("tr td:nth-child(1)");
values =  table.find("tr td:nth-child(2)");
于 2013-09-13T21:49:12.853 回答
0

使用 jQuery:

var table = $('<table>'+str+'</table>');
var result = {};
table.find('tr:gt(0)').each(function () {
    var date = $(this).find("td:nth-child(1)").text();
    var value = $(this).find("td:nth-child(2)").text();
    result[date] = value;
}

:gt(0)是跳过标题行。这将创建一个关联数组对象,将日期映射到值。假设日期是唯一的,这可能比两个数组或一个对象数组更有用。

于 2013-09-13T21:51:41.380 回答