Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Цикл по хэш-массиву


Автор: check 20.8.2007, 11:47
У меня есть хэш который нужно определенным образом отфильтровать
Код

var plans = {
1446: 'И-311',
1448: 'И-411',
1453: 'И-511',
1457: 'И-611',
1460: 'П-712'
}


Написал функцию которая фильтрует хэш по ключу
Код

function HashFilter(x) {  
groups = new Array();
i = 0;
for (var key in plans) {   
  if (key == x) {
    groups[i] = plans[key];
    i++;
  }
}  
/*
дальше какие-то действия с массивом groups
*/

и столкнулся с вышеназванной проблемой.
В ИЕ7 функция не работает, а конкретно не работает цикл for (var key in plans) 
Почему так и что можно сделать?

Добавлено через 13 минут и 30 секунд
При это ие7 зараза ещё никаких ошибок не выдает.  Для него есть какой-нибудь плагин для отладка JavaScript? Internet Explorer Developer Toolbar это не оно?

Автор: dXdYdZ 20.8.2007, 12:02
Вместо функции HashFilter(x) можно написать plans[x]. Ведь всё равно 2 одинаковых ключа не допустимо.

Автор: check 20.8.2007, 12:11
Цитата(dXdYdZ @  20.8.2007,  12:02 Найти цитируемый пост)
Ведь всё равно 2 одинаковых ключа не допустимо
Об этом я не подумал,  тогда наверное мне хэш вообще не подойдёт.

Автор: Zeroglif 20.8.2007, 12:20
IE7 под рукой нет, но нужна ли вообще такая функция, зачем собирать что-то в массив (groups), если свойство всё-равно живёт в одном экземпляре, и есть ли необходимость сравнивать каждое свойство (key) исходного объекта (plans) с некой строкой (x) если можно просто один раз проверить наличие такого свойства в объекте if (x in plans)?

Автор: check 20.8.2007, 13:07
Да-да,   извините ступил. Тут хэши вообще не причём. 
Думаю, нужно создать два "параллельных" массива и фильтровать "правый" массив по значениям "левого".
Дело в том, что то, что я пытался представить в виде ключей хэша - не набор уникальных значений,  эти значения могут повторяться.

Автор: check 20.8.2007, 18:31
Оффтоп получается, но наверное создавать новую тему смысла нет
Код

plans = new Array();
plans[0]='И-311';
plans[1]='И-411';
plans[2]='И-511';
plans[3]='И-611';
plans[4]='П-312';
plans[5]='П-412';
plans[6]='П-512';
plans[7]='П-612';
plans[8]='И-017';
plans[9]='И-211';
plans[10]='И-311';

ReleaseID = new Array();
ReleaseID[0]=1446;
ReleaseID[1]=1448;
ReleaseID[2]=1453;
ReleaseID[3]=1457;
ReleaseID[4]=1447;
ReleaseID[5]=1449;
ReleaseID[6]=1454;
ReleaseID[7]=1458;
ReleaseID[8]=41;
ReleaseID[9]=603;
ReleaseID[10]=603;


function ArrayFilter(x) {  
    var groups = new Array();   
    for (var i=0; i < ReleaseID.length; i++) {  
        if (ReleaseID[i] == x) {
            groups[i] = plans[i];
        }
    }   
    document.getElementById('groups').innerHTML = ""; 
    for (var j=0; j < groups.length; j++) {  
        group = new String(groups[j]);  
        if (group != 'undefined') 
            document.getElementById('groups').innerHTML += "<tr bgcolor='#FFFFFF'><td width='3%'>&nbsp;</td><td width='3%'>&nbsp;</td><td>"  + group + "</td></tr>";
    }  
}

Вот этот код опять-таки отказывается работать в IE,  в FF работает нормально.
Ошибку вызывает любая попытка присвоить что-либо document.getElementById('groups').innerHTML.
С document.getElementById('groups') всё в порядке,  возвращает объект.
id="groups" присвоен пустой таблице
Код

<table border="1" width="100%" id="groups">

</table>


При этом IE обнаруживает в document.getElementById('groups').innerHTML теги <TBODY></TBODY>.
Ладно,  это его право,  но я на всякий случай делаю так
Код

function ArrayFilter(x) {  
    var groups = new Array();   
    for (var i=0; i < ReleaseID.length; i++) {  
        if (ReleaseID[i] == x) {
            groups[i] = plans[i];
        }  
    }    
    row = "";
    document.getElementById('groups').innerHTML = "";
    rowString = new String(row);
    for (var j=0; j < groups.length; j++) {  
        var group = new String(groups[j]);  
        if (group != 'undefined') {
            row = rowString.replace('<TBODY></TBODY>', '');
            row += "<tr bgcolor='#FFFFFF'><td width='3%'>&nbsp;</td><td width='3%'>&nbsp;</td><td>"  + group + "</td></tr>"; 
        }
    }  
    document.getElementById('groups').innerHTML = row;
}

По прежнему в FF все работает,  а в IE все обламывается при первой же попытки записать что-то своё в innerHTML.

Ну есть ещё конечно DOM,  но хотелось бы обойтись innerHTML.

Автор: Zeroglif 20.8.2007, 19:54
http://forum.vingrad.ru/index.php?showtopic=151361&view=findpost&p=1183807

Автор: check 20.8.2007, 21:36
Обидно...     Ну ладно,  DOM так DOM.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)