首页 > 解决方案 > 具有来自表 Javascript 的动态属性的对象

问题描述

我有一个表,其中第一行是列的名称(它们的数量不定),我想将此表转换为 javascript 中的对象。

示例表可能如下所示:

Ticket  | Created    | State
--------+------------+-------
#102314 | 2018-11-12 |  1
#102315 | 2018-11-14 |  5

如果我想把它放在对象中,它看起来像:

var toReturn = [];
var table = [['Ticket', 'Created', 'State'],
            ['#102314', 2018-11-12, 1],
            ['#102315', 2018-11-14, 5]];
           /*This is how i recieve data from google Spreadsheets*/
for(var k = 1; k < table.length; k++) {
  toReturn.push({'Ticket': table[k][0],
                 'Created': table[k][1],
                 'State': table[k][2]});
} //This is working for me

// But I'm trying something like this and it not working
for(var k = 1; k < table.length; k++) {
    toReturn.push({table[0][0]: table[k][0],
                   table[0][1]: table[k][1],
                   table[0][2]: table[k][2]});
}

最终目标是创建具有表中所有属性的对象,而与表中有多少列无关。

标签: javascriptobjectgoogle-apps-script

解决方案


一种可能的方法是使用Array.prototype.reduce()

reduce() 方法在数组的每个成员上执行一个 reducer 函数(您提供),从而产生一个输出值。

reducer函数有 四个参数:

  1. 累加器 (acc)
  2. 当前值(当前)
  3. 当前指数 (idx)
  4. 源数组 (src)

您的 reducer 函数的返回值被分配给累加器,该累加器的值在整个数组的每次迭代中都会被记住,并最终成为最终的单个结果值。

var table = [
  ['Ticket', 'Created', 'State'],
  ['#102314', '2018-11-12', 1],
  ['#102315', '2018-11-14', 5]
];

var transformedTable = table.reduce(function(result, currentRow, rowIndex) {
  // skip the "header row"
  if (rowIndex === 0) {
    return result;
  }

  // create the actual row from the "header row" and the values of the current row
  var row = table[0].reduce(function(resultRow, caption, captionIndex) {
    resultRow[caption] = currentRow[captionIndex];
    return resultRow;
  }, {})

  result.push(row);

  return result;
}, []);

console.log(transformedTable);


推荐阅读