#javascript #jsp #associative-array
#javascript #jsp #ассоциативный массив
Вопрос:
У меня есть 2-D массив Javascript, определенный следующим образом:
proData[prov_999998] = new Array();
proData[prov_999998]["address"] = "29 South St. South #202 Uxbridge ON L9P 1V9";
proData[prov_999998]["phone"] = "555-555-5555";
proData[prov_999998]["fax"] = "444-444-4444";
Я пытаюсь получить доступ к этим элементам массива в этой функции:
function switchPro(value) {
document.getElementById("letterheadName").value = value;
document.getElementById("letterheadAddress").value = providerData[prov_999998]["address"];
document.getElementById("letterheadAddressSpan").innerHTML = providerData[prov_999998]["address"] ;
document.getElementById("letterheadPhone").value = providerData[prov_999998]["phone"];
document.getElementById("letterheadPhoneSpan").innerHTML = providerData[prov_999998]["phone"];
document.getElementById("letterheadFax").value = providerData[prov_999998]["fax"];
document.getElementById("letterheadFaxSpan").innerHTML = providerData[prov_999998]["fax"];
}
Но я получаю сообщение об ошибке: «prov_999998 не определено в «providerData[prov_999998][«адрес»];».
Может кто-нибудь, пожалуйста, помочь мне с этим? Я не могу использовать числа в качестве индексов массива, потому что javascript не принимает индекс массива, начинающийся с ‘0’, такой как [0999]. Эти индексы массива являются идентификаторами, введенными пользователем, и я не могу наложить ограничение на формат идентификатора. Я новичок в javascript, поэтому был бы признателен за любую помощь.
На самом деле, я хочу, чтобы 1-й индекс был переменной. Это то, что я делал:
function switchProvider(value) {
var val = "prov_" value;
document.getElementById("letterheadName").value = value;
document.getElementById("letterheadAddress").value = providerData[val]["address"];
document.getElementById("letterheadAddressSpan").innerHTML = providerData[val]["address"] ;
document.getElementById("letterheadPhone").value = providerData[val]["phone"];
document.getElementById("letterheadPhoneSpan").innerHTML = providerData[val]["phone"];
document.getElementById("letterheadFax").value = providerData[val]["fax"];
document.getElementById("letterheadFaxSpan").innerHTML = providerData[val]["fax"];
}
Но это не работает, значения на веб-странице отображаются как «неопределенные». Что я делаю не так?
Вот еще код, это JSP и Javascript вместе взятые.
var providerData = new Array();
<%
for (Provider p : prList) {
if (!p.getProviderNo().equalsIgnoreCase("-1")) {
String prov_no = "prov_" p.getProviderNo();
%>
providerData[<%=prov_no%>]["address"] = "<%=(p.getClinicAddress() " " p.getClinicCity() " " p.getClinicProvince() " " p.getClinicPostal()).trim() %>";
providerData[<%=prov_no%>]["phone"] = "<%=p.getClinicPhone().trim() %>";
providerData[<%=prov_no%>]["fax"] = "<%=p.getClinicFax().trim() %>";
<% }
} %>
Комментарии:
1. Можете ли вы предоставить больше кода? Является
proData
глобальной переменной? Почему вы переключились наproviderData
позже? Кроме того, в SwitchPro (значение) вы должны (для ваших собственных экспериментов) сделатьfor ( key in providerData[prov_999998]) console.log(key)
и аналогичноfor (key in providerData) console.log(key)
2. Спасибо за добавление дополнительного кода, который проясняет некоторые вещи. Вы намеревались перейти с ProData на providerData? Являются ли ProData или providerData глобальной переменной?
3. providerData — это глобальная переменная, я просто изменил имя с provData … Извините, если это сбивает с толку.
4. для вашего собственного просвещения, в switchProvider включите следующую строку перед
var val='prov_' value;
… (включите это: )for (key in providerData) console.log(key);
и убедитесь, что'prov_' value
она включена в этот список.
Ответ №1:
Синтаксис, который вы используете, предназначен для пар ключ / значение объекта, а не для массивов.
Скорее всего, вам следует использовать
var proData = {};
proData['prov_999998'] = {};
proData['prov_999998']["address"] = "29 South St. South #202 Uxbridge ON L9P 1V9";
proData['prov_999998']["phone"] = "555-555-5555";
proData['prov_999998']["fax"] = "444-444-4444";
и получить к нему доступ с помощью (т. е.)
providerData['prov_999998']["address"];
Теперь, если prov_999998 является переменной, то вы действительно должны получить к ней доступ без добавленных мной кавычек, но убедитесь, что ей присвоено значение, и что это значение все еще сохраняется при попытке использовать его в вашей функции..
оригинальный ответ
Вы должны заключить prov_999998 в кавычки 'prov_999998'
, чтобы сделать его литералом, в противном случае он обрабатывается как переменная.
proData['prov_999998'] = new Array();
proData['prov_999998']["address"] = "29 South St. South #202 Uxbridge ON L9P 1V9";
proData['prov_999998']["phone"] = "555-555-5555";
proData['prov_999998']["fax"] = "444-444-4444";
и
function switchPro(value) {
document.getElementById("letterheadName").value = value;
document.getElementById("letterheadAddress").value = providerData['prov_999998']["address"];
document.getElementById("letterheadAddressSpan").innerHTML = providerData['prov_999998']["address"] ;
document.getElementById("letterheadPhone").value = providerData['prov_999998']["phone"];
document.getElementById("letterheadPhoneSpan").innerHTML = providerData['prov_999998']["phone"];
document.getElementById("letterheadFax").value = providerData['prov_999998']["fax"];
document.getElementById("letterheadFaxSpan").innerHTML = providerData['prov_999998']["fax"];
}
Комментарии:
1. Это не
Array
ы. Скорее инициализируйте с помощью `ProData[‘prov_999998’] = { адрес: ‘…’, телефон: ‘…’, факс: ‘…’ }2. если
var prov_999998 = 'value'
вызывается, то это работает нормально. Я предполагаю, что именно это и происходит.3. На самом деле, я хочу, чтобы это была переменная. Это то, что я делал:
4. @drachenstern, это работает путем присвоения новых свойств объекту array. На самом деле массив не используется как единое целое..
5. @Sapphire, код, который я опубликовал ( используя объекты
{}
вместо массивов ), будет работать просто отлично. Вместо этого вы можете использовать переменную, но вы должны убедиться, что она содержит строку, а не число, чтобы она не теряла начальные значения 0.
Ответ №2:
Тот факт, что в структуре памяти Javascript достаточно индексов, чтобы добраться до 999998, вызывает беспокойство. Вы определенно собираетесь отключить браузер, если большая часть предыдущих записей загружается вместе с ним.
Есть ли что-то неправильное в вызове индекса 999 вместо 0999?
Похоже, вы пытаетесь использовать строки для индексации вторичных элементов в массиве, а не индексы, такие как «адрес» и «телефон».
Итак, ваша структура должна представлять собой хэш-карты хэш-карт:
var providerData = {
'0999': {
address: '321 Sesame St',
zip: '12345'
},
'1000': {// more here
}
};
alert(providerData['0999']['address']); // alerts "321 Sesame St"
Но вы должны учитывать объем загружаемых в него данных.
Комментарии:
1. Нет, для чего-то с 3 * 1 000 000 элементами современные браузеры могут справиться с этим без особых усилий. ~ Я согласен, что IE8 или FX2 захлебнулись бы, но IE9, Chrome, FX4 могут обрабатывать 3 миллиона элементов в массиве с относительной легкостью. Что вызывает беспокойство, так это то, что структура кажется невероятно хрупкой.
2. Это зависит от размера 3 миллионов структур, хранящихся в этих элементах, и от объема обработки.
Ответ №3:
Полагаю, ваш ассоциативный массив неверен (или в вашем коде не хватает информации).
proData[prov_999998] = new Array();
должно быть
proData['prov_999998'] = new Array();
и так далее. В любом случае, вы могли бы использовать объекты javascript, чтобы сделать это аккуратным способом.
Комментарии:
1. Почему это должно быть так? почему нельзя
var prov_999998 = '1'
использовать?