Jquery 获取数组中的 HTML Table 列的文本

Jquery get HTML Table column's text in array

编辑: 我有一个 HTML table 如下图所示,现在我需要用我们上次使用的相同代码制作图表(记住我们必须写一个 jquery 代码到 select数据)。

我这次需要的图表是时间线图表。 (时间 select 在第 4 列和第 9 列中编辑)和每种类型 (Pink/Blue/Green..) 折线图,总金额按时间大写。

示例: 对于绿色 Catégorie 一行代表那个

代码:

  <script>             
 function getData(columnOrder, keyName) {
 var obj, table = $('table'), array = [];
 table.find('tbody tr').each(function() {
 var rows = $(this).find('td:nth-child(' + columnOrder +')');
 rows.each(function(){
    obj = {};
    obj[keyName] = $(this).text();
    array.push(obj);
 });
 });
 return array;
 }

 var Time= getData(4, 'time');
 var datasline1 = getData(5, 'value');
 var datasline2 = getData(5, 'value');
 var datasline3 = getData(5, 'value');
 var datasline4 = getData(5, 'value');


 console.log(Time);
 console.log(datas1/2/3/4);


 $("#chart-container").insertFusionCharts({
 type: "mscombi2d",
 width: "100%",
 height: "40%",
 dataFormat: "json",
 dataSource: {
 "chart": {
 "caption": "Balance Perfomance",

 "exportenabled": "1",
 "theme": "fusion"
 },
 "Time": [
 {
  "Time": Time
  }
 ],
 "dataset": [
 {
  "seriesname": "Line1",
     "renderas": "line",
  "showanchors": "1",
  "data": datasline1
  },
  {
  "seriesname": "Line2",
     "renderas": "line",
  "showanchors": "1",
  "data": datasline2
  },
  ] 
  }
  });

        </script>

编辑 2:我的控制台错误

我为你创建了两个函数。一是按日期分组数据,二是为图表准备数据。这有点复杂,但这不是真正的方法。您应该在服务器端进行数据操作。

我使用 td 的数据值来轻松获取值。您在 td 元素中使用不同的元素,例如 <span>,因此我认为从数据值属性获取数据是更好的选择。

jsfiddle

function groupDataByDate() {
   var columns, columnOrder, data,
       table = $('table'), mainObj = {};

   columns = [
    {
      title: 'date',
      values: [4,9]
    },
    {
      title: 'element',
      values: [1,6]
    },
    {
      title: 'value',
      values: [5,10]
    }
  ];

   table.find('tbody tr').each(function() {
     data = {};
     for(i = 0; i < columns.length; i++) {
       text = $(this).find('td:nth-child(' + columns[i].values[0] +')').data('value');
       if (!text) {
         text = $(this).find('td:nth-child(' + columns[i].values[1] +')').data('value');
       }

       data[columns[i].title] = text;
     }

     if (!mainObj[data.date]) {
       mainObj[data.date] = [];
     }
       mainObj[data.date].push(data);
   });

  // convert to array from object
   return $.map(mainObj, function(value, index) {
       return [value];
   });
}

function getData(data, type) {
  var arr = [], mainObj = {};
  if (type === 'dates') {

    for(i = 0; i < data.length; i++) {
      arr.push({ label: data[i][0].date })
    }

    return arr;
  }

  var subObj = {
      invoice: { value: 0 },
      pettycash: { value: 0 },
      tocash: { value: 0 },
      bankentry: { value: 0 },
  };

  for(index = 0; index < data.length; index++) {

    // sum with previous dates
    for(i = 0; i < data[index].length; i++) {
      subObj[data[index][i].element].value += Number(data[index][i].value);
    }

    arr.push(Object.assign({},{
      invoice: Object.assign({}, subObj.invoice),
      pettycash: Object.assign({}, subObj.pettycash),
      tocash: Object.assign({}, subObj.tocash),
      bankentry: Object.assign({}, subObj.bankentry)
    }));
  }

  return arr;
}

var groupedData = groupDataByDate();
var categoryDatas = getData(groupedData, 'dates');
var valueDatas = getData(groupedData, 'values');

const dataSource = {
  "chart": {
    "caption": "Reach of Social Media Platforms amoung youth",
    "yaxisname": "% of youth on this platform",
    "subcaption": "2012-2016",
    "showhovereffect": "1",
    "numbersuffix": "$",
    "drawcrossline": "1",
    "plottooltext": "<b>$dataValue</b> of youth were on $seriesName",
    "theme": "fusion"
  },
  "categories": [
    {
      "category": categoryDatas
    }
  ],
  "dataset": [
    {
      "seriesname": "Invoice",
      "data": valueDatas.map(function(item){
        return item.invoice
      })
    },
    {
      "seriesname": "PettyCash",
      "data": valueDatas.map(function(item){
        return item.pettycash
      })
    },
    {
      "seriesname": "To Cash",
      "data": valueDatas.map(function(item){
        return item.tocash
      })
    },
    {
      "seriesname": "BankEntry",
      "data": valueDatas.map(function(item){
        return item.bankentry
      })
    }
  ]
};

FusionCharts.ready(function() {
   var myChart = new FusionCharts({
      type: "msline",
      renderAt: "chart-container",
      width: "100%",
      height: "100%",
      dataFormat: "json",
      dataSource
   }).render();
});