Я унаследовал кодовую базу с таким стилем кода и без тестов:
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);
@LGSon Я действительно не хочу использовать для этого объект окна. Я думаю, что может быть лучший способ сохранить целостность данных без необходимости добавлять в окно
Если они объявлены глобально, они уже принадлежат объекту window
Следуя примеру @ LGSon, вы можете создать другой массив, который представляет собой коллекцию вышеуказанных массивов var parentArrays = [series1, series2, ...];, за которыми следует parentArrays[y-1].add(...).
Или вы можете создать объект, который содержит эти массивы как свойства.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете собрать все массивы в один массив и нажать, взяв индекс.
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]
});
}
это сработает, но я хотел бы избавиться от исходных массивов серий. Это не масштабируется. Спасибо
это зависит от того, что вы хотите с ним делать позже.
Используется диаграмма. Как я уже упоминал в исходном вопросе, мы разрешаем более 8. Если мы добавим еще 100, мне нужно будет создать до series99 = [], чтобы это работало.
а ты не пишешь, что любишь с ним делать? весь подход с одним массивом странен. (но в любом случае при отсутствии целевой структуры данных сложно ответить ...)
это отличный момент. Мне нужно будет написать лучший вопрос в будущем. Спасибо за помощь. Согласен, подход странный, пытаюсь улучшить
Исходный код кажется немного странным. У вас есть блок массивов 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 должно было выйти из цикла. Хотя мне нравится такой подход
Предполагая, что они объявлены глобально, попробуйте использовать скобки, например
window['series' + y]