将两个数组中的数据添加到CSV输出中

时间:2019-05-02 11:07:47

标签: javascript arrays

我有一些采用以下格式的JSON。

[
  [
    {
      "ID": 1,
      "col1": "something",
      "col2": "something"
    },
    {
      "ID": 2,
      "col1": "something",
      "col2": "something"
    }
  ],
  [
    {
      "ID": 1,
      "col3": "something else"
    },
    {
      "ID": 2,
      "col3": "something else"
    }
  ]
]

使用D3,我将此JSON解析为多维数组。然后,我正在准备数据以CSV格式下载。所以此刻,我正在做

let csvData = 'ID,col1,col2\n';
data[0].forEach(function(row) {
    let line = [];
    Object.keys(row).forEach(function(key) {
        line.push(row[key])
    });
    csvData = csvData + line.join(',') + '\n';
});

上面的代码将生成一个平面的csv文件

id,col1,col2
1,something,something
2,something,something

我现在想做的是在下一个数组元素中添加与ID匹配的内容,并将col3添加到数据中。因此csvData的整体输出应为

id,col1,col2,col3
1,something,something,something else
2,something,something,something else

如何将这些数据添加到现有的csvData中?

谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用for循环来匹配它们,这样您便有了一个显式的计数器变量,并可以使用它来引用两个数组中的相同索引。

当然,这取决于每个数组中数据的排序方式相同,并且每个数组中元素的数量相同。如果并非总是如此,那么您将无法使用这种方法。

var data = [
  [
    {
      "ID": 1,
      "col1": "something",
      "col2": "something"
    },
    {
      "ID": 2,
      "col1": "something",
      "col2": "something"
    }
  ],
  [
    {
      "ID": 1,
      "col3": "something else"
    },
    {
      "ID": 2,
      "col3": "something else"
    }
  ]
];

let csvData = 'ID,col1,col2,col3\n';
let arr1 = data[0];
let arr2 = data[1];

for (i = 0; i < arr1.length; i++)
{
    let row1 = arr1[i];
    let row2 = arr2[i];
    let line = [];
    Object.keys(row1).forEach(function(key) {
        line.push(row1[key])
    });

    line.push(row2["col3"]);
    csvData = csvData + line.join(',') + '\n';
}

console.log(csvData);

答案 1 :(得分:1)

这不是万无一失的,但它会根据JSON数组的数组动态构建CSV字符串。

我试图保持简洁,但留在转换字段,记录等的关键点...

if (Set.prototype.addAll === undefined) {
  Set.prototype.addAll = function(array) {
    let args = arguments.length > 1 ? arguments : array;
    args.forEach(item => this.add(item)); /* Add multiple items from array to a set */
    return this;
  };
}

console.log(multiDataToCsv(getData(), 'ID', '\t'));

function multiDataToCsv(jsonArrays, primaryKey, delimiter) {
  let keys = Array.from(jsonArrays.reduce((fields, jsonArray) => {
    return fields.addAll(Object.keys(jsonArray[0]));
  }, new Set()));
  let records = jsonArrays[0].reduce((records, data) => {
    return records.concat(jsonArrays.reduce((record, jsonArray) => {
      return Object.assign(record, jsonArray.filter(item => item[primaryKey] === data[primaryKey])[0]);
    }, {}));
  }, []);
  let csvData = [keys].concat(records.map(record => keys.map(key => record[key])));
  return csvData.map(row => row.join(delimiter)).join('\n');
}

function getData() {
  return [
    [{
      "ID": 1,
      "col1": "something 1.0",
      "col2": "something 1.1"
    }, {
      "ID": 2,
      "col1": "something 2.0",
      "col2": "something 2.1"
    }],
    [{
      "ID": 1,
      "col3": "something else 1"
    }, {
      "ID": 2,
      "col3": "something else 2"
    }]
  ];
}
.as-console-wrapper { top: 0; max-height: 100% !important; }