Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как переименовать свойство объекта? (https://javascript.ru/forum/events/32639-kak-pereimenovat-svojjstvo-obekta.html)

Маэстро 24.10.2012 11:42

Как переименовать свойство объекта?
 
// создаем объект
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];

Slavenin 24.10.2012 13:13

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

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

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

Маэстро 24.10.2012 13:44

Цитата:

Сообщение от Slavenin (Сообщение 211949)
перезаписываете, удаляете

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

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 дадут кашеобразный результат.

melky 24.10.2012 14:05

Цитата:

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

в основах JS говорится, что объекты передаются не по значению, а по ссылке.

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

чтобы легко менять ключи, организуйте велосипед свою структуру хранения данных.

Slavenin 24.10.2012 14:23

Цитата:

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

Маэстро 24.10.2012 15:24

Цитата:

Сообщение от melky (Сообщение 211959)
в основах 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

Маэстро 24.10.2012 15:26

Цитата:

Сообщение от Slavenin (Сообщение 211961)
и? "http://javascript.ru/Array/sort"

1. sort работает только с массивами m=[];
2. у меня объект m={};

trikadin 24.10.2012 16:37

Цитата:

Сообщение от Маэстро
Да, говорится. Но не факт.

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

Учим матчасть, короче.

trikadin 24.10.2012 16:42

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

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)

Dim@ 24.10.2012 16:51

Маэстро,
мдаа залёт конечно такой бред нести, ну ладно:
Цитата:

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

1
Цитата:

Однако не со свойствами объектов (при их копировании одного другому)
это не так
2
Цитата:

Это означает, что если после "передачи объекта" изменить второй объект, то изменения незамедлительно отразятся в первом объекте.
естественно так как они ссылаются на одно и тоже
3
Цитата:

Так с объектами
и с массивами тоже как я помню, и абсолютно неважно является ли они свойствами других объектов


Часовой пояс GMT +3, время: 10:19.