我有一个对象数组。其中一些对象具有共享属性,但并非每个对象都具有所有属性,并且各个对象的属性顺序可能不同。考虑以下因素:
var arr = [{ foo: 1, bar: 2}, { foo: 3, thing: 4}, {thing: 5, bar: 6}]
我需要将此数组转换为 CSV,以便第一行是包含所有属性名称的标题,如果该属性存在于对象中,则将填充该属性,否则为空字符串。顺序不一定重要,只要每行中每个项目的顺序与标题的顺序一致即可。
期望的输出:
foo,bar,thing
1,2,
3,,4
,6,5
最佳答案
function getCsvLines(input) {
var CSV_SEPARATOR = ',';
var headers = getHeaders(input);
var lines = getLines(input, headers);
return [headers.join(CSV_SEPARATOR)].concat(lines);
function getHeaders(input) {
var headers = new Set();
input.forEach(function (obj) {
Object.keys(obj).forEach(function (key) {
headers.add(key);
});
});
return Array.from(headers);
}
function getLines(input, headers) {
var lines = [];
input.forEach(function (obj) {
var line = [];
headers.forEach(function (head) {
line.push(obj[head] || '');
});
lines.push(line);
});
return lines.map(function(line) {
return line.join(CSV_SEPARATOR);
});
}
}
getCsvLines(arr); // -> ["foo,bar,thing", "1,2,", "3,,4", ",6,5"]
getCsvLines
函数返回用于导出的 csv 行数组。
要更改值的顺序,只需在将 headers
数组传递给 getLines
之前重新排序即可。
关于javascript - (Javascript) 当属性不存在时,如何使用 csv 中的标题和空字符串将对象属性获取到 csv?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46738727/