Javascript «неопределенный» при использовании переменной функции в массиве объектов - PullRequest
1 голос
/ 08 января 2012

У меня есть следующий (пример) массив объектов:

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>';
    }
}

'undefined' - это результат при вызове, как показано ниже (как я и ожидал, поскольку '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;
}

Ответы [ 2 ]

3 голосов
/ 08 января 2012

Попробуйте:

function printValuesVar( arr, elemId, arrId, arrNum ) {
    var content = '';

    arr.forEach( function ( arrElem ) {
        content += arrElem[ arrId ] + ' = ' + arrElem[ arrNum ] + '<br>';
    });

    document.getElementById( elemId ).innerHTML = content;
}

Или немного более продвинутый:

function printValuesVar( arr, elemId, arrId, arrNum ) {
    document.getElementById( elemId ).innerHTML = arr.map( function ( arrElem ) {
        return arrElem[ arrId ] + ' = ' + arrElem[ arrNum ];
    }).join( '<br>' );
}

ES5-шим для дерьмовых браузеров

2 голосов
/ 08 января 2012

Поскольку вы ищете ключ "arrId", а не ключ, сохраненный в переменной arrId

document.getElementById(elemId).innerHTML += obj[arrId] + ' = ' + obj[arrNum] + '<br>';
...