Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 24.10.2012, 11:42
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Как переименовать свойство объекта?
// создаем объект
var m={};

// создаем у него три свойства и присваиваем им значения
m[5]='mama';
m[6]='papa';
m[7]='deda';

// или так:
m.x='mama';
m.y='papa';
m.z='deda';

alert(m[4] + ' ' + m[5] + ' ' + m[6] + ' ' + m[7]);  // undefined mama papa deda    

// как переименовать свойство "5" в свойство "4", чтобы при обращении к m[4] мы бы получили значение из бывшего m[5], а m[5] типа исчезло вообще?
// имеется ввиду не копирование m[4]=m[5];
Ответить с цитированием
  #2 (permalink)  
Старый 24.10.2012, 13:13
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

перезаписываете, удаляете

m = {};
m.a = 'a';
m.b = 'b';
m.c = 'c';

m.b = m.a;
delete m.a;
console.log(m);
__________________

Ответить с цитированием
  #3 (permalink)  
Старый 24.10.2012, 13:44
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от Slavenin Посмотреть сообщение
перезаписываете, удаляете
Это я уже пробовал. Поэтому специально попросил вариант решения без присвоения одного свойства другому. Почему? -тому есть две причины.

1. В примере я упрощенно написал
m[5]='mama';
m[6]='papa';
m[7]='deda';
Но вместо 'mama' и 'papa' в данных свойствах могут храниться другие многомегабайтные объекты. Присвоение одного свойства другому приведет (я так интуитивно считаю) к перегону больших массивов информации по памяти из одного места в другое. А если в объекте m несколько тысяч свойств, то процедура будет работать долго.

2. Показанный мною пример - это упрощенный случай задачи (тоже несколько упрощаю формулировку):
Есть объект m={}; причем подчеркиваю, что это не массив m=[];
Данный объект содержит тысячу свойств m[1]...m[1000].
Необходимо удалить 100-е свойство из данного объекта, и все свойства, что имеют ключ > 100 сместить "вниз", в сторону меньших индексов. То есть 101-е свойство должно стать сотым, 102-е перейти на 101-е,... 1000-е перейти на 999-е.
На ум приходит организовать цикл - перебор свойств и "перенос" данных из одного свойства в другое:
for (var key in m)  m[key-1] = m[key];
Это работает! Однако, как всегда кто-нибудь это обезобразит! Проверка в разных браузерах показала, что
-перебор от млаших к старшим key идет только в Opera и Google Chrome.
-в Fire Fox перебор идет в том же порядке, в котором шло присвоение свойств
-в IE также как и в Fire Fox перебор идет в том же порядке, в котором шло присвоение свойств, однако после прохода последнего элемента, созданного до цикла начинается просмотр элементов, созданных в цикле (что приводит к зависанию...)
т.е. если присвоение было не последовательно в порядке возрастания ключей
m[7]='deda';
m[6]='papa';
m[5]='mama';
m[1]='1111';
m[17]='1717';
m[2]='2222';
m[25]='2525';
m[3]='3333';

то Fire Fox и IE дадут кашеобразный результат.
Ответить с цитированием
  #4 (permalink)  
Старый 24.10.2012, 14:05
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Маэстро
многомегабайтные объекты. Присвоение одного свойства другому приведет (я так интуитивно считаю) к перегону больших массивов информации по памяти из одного места в другое.
в основах JS говорится, что объекты передаются не по значению, а по ссылке.

т.е. многомегабайтовый объект останется валяться там, где валялся.

чтобы легко менять ключи, организуйте велосипед свою структуру хранения данных.
Ответить с цитированием
  #5 (permalink)  
Старый 24.10.2012, 14:23
Кандидат Javascript-наук
Отправить личное сообщение для Slavenin Посмотреть профиль Найти все сообщения от Slavenin
 
Регистрация: 20.11.2010
Сообщений: 143

Цитата:
то Fire Fox и IE дадут кашеобразный результат.
и? sort
__________________

Ответить с цитированием
  #6 (permalink)  
Старый 24.10.2012, 15:24
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от melky Посмотреть сообщение
в основах JS говорится, что объекты передаются не по значению, а по ссылке.
т.е. многомегабайтовый объект останется валяться там, где валялся.
Да, говорится. Но не факт. Что означает по ссылке? Это означает, что если после "передачи объекта" изменить второй объект, то изменения незамедлительно отразятся в первом объекте. Это значит, что и первый, и второй объект ссылаются на одну и ту же зону памяти, которая "валяется там, где валяется". Так с объектами. Однако не со свойствами объектов (при их копировании одного другому). Сравните:
var m1 = {};
var m2 = {};
var m3 = {};
      
m1[5]='mama';
m2=m1; // присвоение по ссылке
m3[5] = m1[5]; // присвоение не по ссылке (копирование/дублирование данных)
m1[5] = 'privet'; // изменим объект m1 - повлияет ли он на m2 и m3? 
      
alert('m1[5]=' + m1[5] + ' m2[5]=' + m2[5] + ' m3[5]=' + m3[5]);
// выведет: m1[5]=privet m2[5]=privet m3[5]=mama
Ответить с цитированием
  #7 (permalink)  
Старый 24.10.2012, 15:26
Профессор
Отправить личное сообщение для Маэстро Посмотреть профиль Найти все сообщения от Маэстро
 
Регистрация: 02.07.2010
Сообщений: 642

Сообщение от Slavenin Посмотреть сообщение
и? "http://javascript.ru/Array/sort"
1. sort работает только с массивами m=[];
2. у меня объект m={};
Ответить с цитированием
  #8 (permalink)  
Старый 24.10.2012, 16:37
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Сообщение от Маэстро
Да, говорится. Но не факт.
Охренеть. Почему не факт??? Это написано в документации, и браузеры работают только так. А ваш пример просто идиотский - строки, в отличие от объектов - примитивные типы, и вот они как раз-таки копируются заново.

Учим матчасть, короче.
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #9 (permalink)  
Старый 24.10.2012, 16:42
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Допишу примерчик ещё:

var m1 = {};
var m2 = {};
var m3 = {};
       
m1[5]={"bla": 123};
m2=m1; 
m3[5] = m1[5]; 
m1["5"].bla = 12345

alert(m1[5].bla +" "+ m2[5].bla + " " + m3[5].bla)
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #10 (permalink)  
Старый 24.10.2012, 16:51
Аватар для Dim@
Профессор
Отправить личное сообщение для Dim@ Посмотреть профиль Найти все сообщения от Dim@
 
Регистрация: 21.04.2012
Сообщений: 951

Маэстро,
мдаа залёт конечно такой бред нести, ну ладно:
Сообщение от Маэстро
Что означает по ссылке? Это означает, что если после "передачи объекта" изменить второй объект, то изменения незамедлительно отразятся в первом объекте. Это значит, что и первый, и второй объект ссылаются на одну и ту же зону памяти, которая "валяется там, где валяется". Так с объектами. Однако не со свойствами объектов (при их копировании одного другому)
1
Цитата:
Однако не со свойствами объектов (при их копировании одного другому)
это не так
2
Цитата:
Это означает, что если после "передачи объекта" изменить второй объект, то изменения незамедлительно отразятся в первом объекте.
естественно так как они ссылаются на одно и тоже
3
Цитата:
Так с объектами
и с массивами тоже как я помню, и абсолютно неважно является ли они свойствами других объектов
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обратиться к свойству объекта по имени если оно хранится в переменной xaknik Общие вопросы Javascript 2 25.04.2012 23:12
Может ли свойство объекта быть массивом??? Alexeich Общие вопросы Javascript 25 21.11.2011 13:47
Как поменять свойство плагина? lyapharov jQuery 2 16.04.2011 19:39
Как по событию вызвать метод определенного экземпляра объекта jvs jQuery 3 24.12.2009 16:04
как узнать тип значения объекта? VHS Общие вопросы Javascript 1 07.01.2009 23:57