Сортировка данных CSV в объекте JS

Мне нужна помощь в сортировке 1370 строк данных CSV с помощью JS! Я использую библиотеку d3 для создания визуализации данных.

CSV находится здесь: https://github.com/nickrinaldi88/BreitBart_DataVis/blob/main/breitbartData.csv

Мой проект:

У меня есть файл csv с 3 столбцами: Date, Word и Count.

По сути, я хочу иметь 10 разных массивов объектов для каждого уникального слова (есть 10 уникальных слов), например:

var Obama = [{date: 'the date', count: 72}, {date: 'the date', count: 41}]
var Trump = [{date: 'the date', count: 568}, {date: 'the date', count: 92}]

Для каждого слова имеется 136 строк данных, что означает, что в идеале я хочу, чтобы каждый массив содержал 136 объектов, соответствующих существующим атрибутам даты и количества.

Должен ли я использовать функцию d3.nest?

Я обнаружил, что пытаюсь динамически создавать массивы в цикле, но мне трудно получить желаемый результат. Толчок в правильном направлении поможет.

Спасибо!

🤔 А знаете ли вы, что...
JavaScript позволяет создавать динамические и интерактивные веб-приложения.


1
306
1

Ответ:

Решено

Вот один из подходов с ванильным JavaScript.

Отказ от ответственности Это довольно дорогой подход, и приложив немного усилий, его можно оптимизировать для повышения производительности.

Сначала извлеките данные...

затем начните с обработки CSV:

  1. Разделить строку CSV (разделить)
  2. Удалить заголовок (срез)
  3. Отфильтруйте последнюю пустую строку (фильтр)
  4. Итерировать массив строк, чтобы создать массив массивов (карта)
function processCSV(csv){
  return csv.split("\r\n").slice(1).filter(c=>c).map(d=>d.split(','));
}

затем найдите уникальные слова:

  1. Используйте набор, чтобы обеспечить только уникальные значения
  2. Повторите данные, чтобы извлечь уникальные слова и добавить в набор
  3. Возвращает массив уникальных слов и данных
function findUniqueWords(data){
  const words = new Set(); 
  data.forEach(d=>{
    words.add(d[1]);
  });
  return [Array.from(words), data];
}

затем создайте необходимые форматированные массивы объектов:

  • Повторяйте уникальные слова
    • фильтровать данные только для записей, содержащих это слово
    • Повторите эти записи, чтобы создать нужный формат
function createArrays(args) {
  const [words,data] = [...args];
  return words.map(w=>{
    return data.filter(record=>record[1] === w).map(fd=>{
      return {[w]:{date:fd[0], count: fd[2]}};
    });
  }).flat();
}

затем сделайте что-нибудь с выводом

Вот полный код. Этот код не будет работать здесь из-за ограничений CORS.

fetch('https://raw.githubusercontent.com/nickrinaldi88/BreitBart_DataVis/main/breitbartData.csv')
.then(res=>res.text())
.then(processCSV)
.then(findUniqueWords)
.then(createArrays)
.then(console.info);

function processCSV(csv){
  return csv.split("\r\n").slice(1).filter(c=>c).map(d=>d.split(','));
}

function findUniqueWords(data){
  const words = new Set(); 
  data.forEach(d=>{
    words.add(d[1]);
  });
  return [Array.from(words), data];
}

function createArrays(args) {
  const [words,data] = [...args];
  return words.map(w=>{
    return data.filter(record=>record[1] === w).map(fd=>{
      return {[w]:{date:fd[0], count: fd[2]}};
    });
  }).flat();
}

Наконец, вот ответ, чтобы продемонстрировать результат:

https://repl.it/@randycasburn/AlertPoorCodes