Javascript 2-d ассоциативные массивы

#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' использовать?