Показать сообщение отдельно
  #29 (permalink)  
Старый 25.10.2012, 17:02
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от melky
length - длину значений - см. массив.
Сообщение от melky
было бы неплохо не учитывать унаследованные свойства и проверять ключ на принадлежность к числу.
Короче говоря, я тщательно исследовал Ваш код (пример) и пришел к выводу, что со свойством length надо быть осторожным.
Не знаю, что Вы подразумевали под "длиной значений", но для нормальной работы Вашего алгоритма в length должно быть не количество элементов (свойств объекта), а максимальный индекс свойства (это максимальное значение ключа), увеличенный на 1. Причем IE как всегда выпендрился: ему не надо к length прибавлять 1, иначе в объекте остается одно лишнее свойство (последнее). Код получился такой:
var myObj = {};
      myObj.length = 0; // это не количество элементов, а максимальный индекс + 1
      
myObj[1]= "1";
myObj[3]= "3";
myObj[2]= "2";     
myObj[0]= "0";
myObj[100]= "100";
myObj[99]= "99";  
     
var length = 0; 
      
// подсчет length как количества свойств
///for (i in myObj) length++; 
      
// подсчет length как максимального индекса      
for (i in myObj)
 {
 if (i > length) length = Number(i);
 };
if (window.IE)
myObj.length = length; 
else myObj.length = length + 1;

var s = '';
for (var key in myObj) s = s + ' ' + key + '=' + myObj[key];
alert('1). ' + s); 
// 1).  0=0 1=1 2=2 3=3 99=99 100=100 length=101

      Array.prototype.splice.call(myObj, 2, 1); // удаляем один элемент
      
var s = '';
for (var key in myObj) s = s + ' ' + key + '=' + myObj[key];
alert('2). ' + s); 
// 2).  0=0 1=1 2=3 98=99 99=100 length=100
Ответить с цитированием