Как мне провести рефакторинг цикла eval в Javascript?

Я унаследовал кодовую базу с таким стилем кода и без тестов:

  var series1 = [];
  var series2 = [];
  var series3 = [];
  var series4 = [];
  var series5 = [];
  var series6 = [];
  var series7 = [];
  var series8 = [];
  for (var y = 1; y <= seriesData.length; y++) {
      // columns are series
      eval("series" + y).push({
        label: "series" + y,
        lineColor: colorArr[seriesData[y - 1].colorIndex],
        x: sampleTime,
        y: rows[x][seriesData[y - 1].index]
      });
  } 

Основная проблема в том, что мы собираемся обрабатывать более 8 наборов данных. Лично мне не очень нравится этот стиль кода, и я читал, что функция eval может быть вредной в JS. Есть ли лучший способ реорганизовать это?

Что я пробовал:

  let multiarr = []
  for (var y = 1; y <= seriesData.length; y++) {
    // columns are series
    let arr = [];
    arr.push({
      label: "series" + y,
      lineColor: colorArr[seriesData[y - 1].colorIndex],
      x: sampleTime,
      y: rows[x][seriesData[y - 1].index]
    });

  }
  multiarr.push(arr);

Предполагая, что они объявлены глобально, попробуйте использовать скобки, например window['series' + y]

Asons 28.12.2018 22:52

@LGSon Я действительно не хочу использовать для этого объект окна. Я думаю, что может быть лучший способ сохранить целостность данных без необходимости добавлять в окно

Sean Kelly 28.12.2018 22:53

Если они объявлены глобально, они уже принадлежат объекту window

Asons 28.12.2018 22:55

Следуя примеру @ LGSon, вы можете создать другой массив, который представляет собой коллекцию вышеуказанных массивов var parentArrays = [series1, series2, ...];, за которыми следует parentArrays[y-1].add(...).

Matthew 28.12.2018 22:55

Или вы можете создать объект, который содержит эти массивы как свойства.

Adrian 28.12.2018 22:56
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете собрать все массивы в один массив и нажать, взяв индекс.

var series1 = [],
    series2 = [],
    series3 = [],
    series4 = [],
    series5 = [],
    series6 = [],
    series7 = [],
    series8 = [],
    data = [series1, series2, series3, series4, series5, series6, series7, series8];

for (var y = 0; y < seriesData.length; y++) {
    data[y].push({
        label: "series" + (y + 1),
        lineColor: colorArr[seriesData[y].colorIndex],
        x: sampleTime,
        y: rows[x][seriesData[y].index]
    });
}

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

Sean Kelly 28.12.2018 23:13

это зависит от того, что вы хотите с ним делать позже.

Nina Scholz 28.12.2018 23:15

Используется диаграмма. Как я уже упоминал в исходном вопросе, мы разрешаем более 8. Если мы добавим еще 100, мне нужно будет создать до series99 = [], чтобы это работало.

Sean Kelly 28.12.2018 23:17

а ты не пишешь, что любишь с ним делать? весь подход с одним массивом странен. (но в любом случае при отсутствии целевой структуры данных сложно ответить ...)

Nina Scholz 28.12.2018 23:18

это отличный момент. Мне нужно будет написать лучший вопрос в будущем. Спасибо за помощь. Согласен, подход странный, пытаюсь улучшить

Sean Kelly 28.12.2018 23:20
Ответ принят как подходящий

Исходный код кажется немного странным. У вас есть блок массивов series, но каждый из них получает только один элемент. Разве это нельзя просто свести к:

const result = seriesData.map((item, i) => ({
  label: `series${i + i}`,
  lineColor: colorArr[item.colorIndex],
  x: sampleTime,
  y: rows[x][item.index]
}))

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

const multiarr = seriesData.map((item, i) => [{
  label: `series${i + i}`,
  lineColor: colorArr[item.colorIndex],
  x: sampleTime,
  y: rows[x][item.index]
}])

в моем исходном коде есть опечатка, нажатие на multiarr должно было выйти из цикла. Хотя мне нравится такой подход

Sean Kelly 28.12.2018 23:10

Другие вопросы по теме