Можно ли сократить код(csv)?

function arrayToCsv(data) {
  return data.map((arr) => {
    return arr.map((el) => {
      let str = '';
      if (typeof el === 'number') {
        str = el;
      } else if (typeof el === 'string') {
        str = `${el.replace(/"/g, '""')}`;
        if (/[,"]/.test(str)) {
          return `"${str}"`;
        }
      }
      return str;
    });
  }).join('\n');
}

// пример
console.log(arrayToCsv([[1, 2], ['a', 'b']])); // '1,2\na,b'
console.log(arrayToCsv([[1, 2], ['a,b', 'c,d']])); // '1,2\n"a,b","c,d"'

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

Автор решения: Alex Krass

Стандартное приведение массива в строку уже содержит нужное поведение, единственное нужно вложенные строковые элементы обернуть в двойные кавычки при наличии запятой.

function arrayToCsv(data) {
  return data.map((arr) => {
    return arr.map((el) => {
      el = `${el}`.includes(`"`) ? `${el.replaceAll('"', '""')}` : el;
      return `${el}`.includes(`,`) || `${el}`.includes(`"`) ? `"${el}"` : el;
    });
  }).join('\n');
}

// пример
console.log(arrayToCsv([[1, 2], ['a', 'b']])); // '1,2\na,b'
console.log(arrayToCsv([[1, 2], ['a,b', 'c,d']])); // '1,2\n"a,b","c,d"'
console.log(arrayToCsv([['"text"', 'other "long" text']])); // """text""","other ""long"" text" 

→ Ссылка