我有一些采用以下格式的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
中?
谢谢
答案 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; }