#javascript #arrays #copy #datalist
#javascript #массивы #Копировать #datalist
Вопрос:
У меня есть несколько массивов текстовых значений, и я хочу использовать один из них для заполнения списка данных HTML на основе выбора пользователем значения в другом списке данных. Я не знаю, как это закодировать.
Вот мой код, но он не завершен. Видишь ???? и мне может понадобиться какой-то дополнительный код. Было бы лучше всего сохранить массивы карт в HTML или поместить их в один или несколько файлов (js или text). Если они должны быть в файлах, я не уверен, как ссылаться на них.
Это работает, если я жестко закодирую использование map1 или map2 вместо mapArray.
<script>
var str=''; // variable to store the options
var mapName = map; //will be text "Map 1" or "Map 2" up to "Map 30"
var map1 = new Array("Caitlin", "Roadrunner", "More Values");
var map2 = new Array("Ceedee #1, Ceedee#2"); // up to 30 values
var mapArray[] = ????? //I want to copy the array for Map 1 or Map 2..
for (var i=0; i < mapArray.length; i) {
str = '<option value="' mapArray[i] '" />'; // Storing options in
// variable
}
var my_list=document.getElementById("theList");
my_list.innerHTML = str;
</script>
Ответ №1:
Звучит как использование оператора распространения ...
var map1 = new Array("Caitlin", "Roadrunner", "More Values");
var map2 = new Array("Ceedee #1, Ceedee#2");
var mapArray = [...map1, ...map2];
// map1 is now ["Caitlin", "Roadrunner", "More Values", "Ceedee #1, Ceedee#2"]
Комментарии:
1. Это объединит две группы параметров, не похоже, что OP хотел бы этого
2. Упс, тогда это моя ошибка.
Ответ №2:
Вы можете использовать функцию push array для сохранения нового элемента в конце массива.
Итак, если бы вы хотели создать массив своих массивов, вы могли бы сделать:
var mapArray = new Array();
var map1 = new Array("Caitlin", "Roadrunner", "More Values");
mapArray.push(map1);
var map2 = new Array("Ceedee #1, Ceedee#2");
mapArray.push(map2);
Это приведет к тому, что значение mapArray
будет равно [ map1, map2 ]
.
Вам нужно будет изменить свой for
цикл, потому что это 2D-массив.
Так что это может выглядеть примерно так:
// choice variable is the chosen input from user
for (var i=0; i < mapArray[choice].length; i) {
str = '<option value="' mapArray[choice][i] '" />';
}
Что касается других ваших вопросов, то они в основном основаны на мнениях. Я рекомендую вам заставить желаемую функциональность работать, а затем расширить ее, чтобы посмотреть, сможете ли вы сделать код чище.
Комментарии:
1. Извините, если я не совсем ясно выразился. Я хочу заполнить список данных значениями map1 только в том случае, если пользователь выбрал Карту 1 из предыдущего выбора списка данных в форме. Если пользователь выбрал Карту 2, то я хочу заполнить список данных только значениями map2. mapArray должен содержать только значения Caitlin, Roadrunner и другие или он должен содержать только Ceedee # 1 и Ceedee # 2.
Ответ №3:
Нет необходимости копировать массивы, просто сохраните все доступные параметры в объекте и получите доступ к массиву, который вы хотите, по индексу.
Кроме того, вы могли бы заполнить <select/>
элемент без построения строки. При использовании Option()
ваш код будет гораздо менее подвержен неэкранированным проблемам с символами.
const selectedMap = 'map1';
const maps = {
'map1': ["Caitlin", "Roadrunner", "More Values"],
'map2': ["Ceedee #1, Ceedee#2"]
};
let theList = document.getElementById("theList");
theList.options = []; // Empty out all previous options in the <select/> (if any)
maps[selectedMap].forEach((val, index) => {
theList[index] = new Option(val, val);
});
<select id='theList'></select>