#javascript #multidimensional-array #initialization
#javascript #многомерный массив #инициализация
Вопрос:
У меня есть апплет, который позволяет пользователю определять значения для 10 переменных, все из которых могут быть массивами. Затем я хочу, чтобы программа перебирала все возможные комбинации, а затем сохраняла вычисления в переменной.
Ранее я жестко запрограммировал его для инициализации результирующего массива SIGMA путем перебора каждой переменной, независимо от того, является ли она вектором или отдельным значением, т. Е.:
SIGMA = new Array(A.length);
for (i1=0; i1<A.length; i1 ) {
SIGMA[i1] = new Array(B.length);
for (i2=0; i2<B.length; i2 ) {
SIGMA[i1][i2] = new Array(C.length);
for (i3=0; i3<C.length; i3 ) {
...
}
}
}
В результате получается 10-мерный СИГМА-массив, что делает обработку очень медленной, если несколько или более переменных являются массивами.
Что я хотел бы сделать, так это инициализировать SIGMA только для тех переменных, которые представляют собой массив, а не единственное значение. Поэтому, если все переменные представляют собой одно число, за исключением двух, скажем, X и Y, тогда я бы хотел иметь:
SIGMA = new Array(X.length);
for (i1=0; i1<X.length; i1 ) {
SIGMA[i1] = new Array(Y.length);
}
Однако я не совсем уверен, как лучше всего это сделать, поскольку количество циклов for будет зависеть от количества переменных, являющихся массивами. Я думаю, мне нужно либо использовать рекурсивную функцию, либо каким-то образом включить цикл while.
У кого-нибудь есть хорошие идеи о том, как это можно сделать? Спасибо!
Ответ №1:
Я смог решить эту проблему, создав рекурсивную функцию, которая включала циклы for:
sigma = new Array(eval(var_idx[0]).length);
sigma_forloop('sigma', 0)
function sigma_forloop(X, idx) {
for (var i=0; i<eval(var_idx[idx]).length; i ) {
eval(X '[' i ']' ' = new Array(eval(var_idx[idx 1]).length);')
if (idx 2 < var_idx.length) {
var Y = X '[' i ']';
sigma_forloop(Y, idx 1);
}
}
}
Переменная ‘var_idx’ в массиве строк, содержащих переменные, которые имеют более одного значения, поэтому я хочу перебрать эти переменные.
Я уверен, что есть более простой способ сделать это, но пока это работает.
Комментарии:
1. Так оно и есть… так оно и есть. Мой опыт работы с JavaScript очень ограничен, поэтому я просто счастлив, когда что-то действительно работает. Есть ли гораздо более простой способ добиться этого?