У меня есть следующий (пример) массив объектов:Javascript «неопределенными» при использовании переменной функции на множестве объектов
var theArray = [
{theId:'1', num: 34},
{theId:'2', num: 23},
{theId:'5', num: 26}
];
и эта функция, которая прекрасно работает в цикле через них:
function printValues() {
var i = 0;
for(i; i<theArray.length; i++) {
var obj = theArray[i];
document.getElementById('result1').innerHTML += obj.theId + ' = ' + obj.num + '<br>';
}
}
Однако, если я хочу абстрагироваться эту функцию для использования в подобных массивов с помощью функции переменных для доступа к объектам в них, как это:
function printValuesVar(arr,elemId,arrId,arrNum) {
var i = 0;
for(i; i<arr.length; i++) {
var obj = arr[i];
document.getElementById(elemId).innerHTML += obj.arrId + ' = ' + obj.arrNum + '<br>';
}
}
«не определена» результат при вызове, как показано ниже (как я вроде ожидать, так как «Arrid» не имя объекта):
printValuesVar(theArray,'result2','theId','num');
Как можно использовать значение, передаваемое переменную функцию к получить доступ к значениям объектов в массиве по имени?
переписаны следующие советы против antipatterns:
function printValuesVar(arr,elemId,arrId,arrNum) {
var i = 0;
var content = '';
for(i; i<arr.length; i+=1) {
var obj = arr[i];
content += obj[arrId] + ' = ' + obj[arrNum] + '<br>';
}
document.getElementById(elemId).innerHTML = content;
}
Ваш код содержит несколько антишаблоны: (1) Вы запрос через 'getElementById' внутри цикла - нет необходимости. Просто получите ссылку заранее; (2) вы присваиваете 'innerHTML' внутри цикла - снова нет необходимости в этом. Вы хотите сохранить DOM-манипуляцию как минимум. Постройте строку HTML с циклом, а затем присвойте 'innerHTML' * после * цикла. –
+1 для руководства - так как это был учебный процесс, я переписал функцию (добавленную выше), чтобы включить ваши предложения, * перед тем, как смотреть на ваши примеры ниже. Теперь я попробую совет от PointedEars. –