Как перевести двумерный массив (массив массивов) в CSV формат и вернуть строку?

Например у нас есть массив:

const arr = [[1, 2], ['a', 'b']]

нужно вернуть строку в формате CSV:

'1,2\na,b' // примерно вот так

Как это реализовать?


Ответы (2 шт):

Автор решения: Vasily

Можно сделать так:

const array = [[1, 2], ["a", "b"]]

const temp = []

array.forEach((arr, i) => {
    const line = arr.join(",")
    temp.push(i === 0 ? `${line}\n` : line)
})

const result = temp.join("")

console.log(result)
// 1,2
// a,b

console.log(JSON.stringify(result))
// "1,2\na,b"

Отдельно добавляю способ, предложенный пользователем @Grundy, на случай, если перенос строки необходим не только после первого массива:

const array = [[1, 2], ["a", "b"]]

const result = array.join("\n")

console.log(result)
// 1,2
// a,b

console.log(JSON.stringify(result))
// "1,2\na,b"

→ Ссылка
Автор решения: Stepan Kasyanenko

Запятую, перевод строки и двойные кавычки надо эскейпить.

const array = [
  [1, 2],
  [',,,"'],
  [',"",'],
  ['"""'],
  ['"'],
  ['a\nb'],
  ['ac']
];

function escapeCSV(val) {
  if (typeof val === 'string') {
    if (val.match(/(,|"|\n)/)) {
      val = val.replace(/"/g, '""');
      val = `"${val}"`;
    }
    return val;
  } else {
    return val;
  }
}

function getCSVFromArray(arr) {
  return arr.map((item, i) => {
    return item.map(m => escapeCSV(m)).join(",");
  }).join('\n');
}

console.log(getCSVFromArray(array));

→ Ссылка