powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / php-шный массив для JS
8 сообщений из 8, страница 1 из 1
php-шный массив для JS
    #36533519
Фотография Пионэр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JS массив не сохраняет индексы, то есть ключи:

то есть, если создать такой вот массивчик из трёх элементов (1, 2, 5), то на самом деле мы будем иметь массив из шести элементов:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
var a = new Array();


a[ 1 ] = 'первый'
a[ 2 ] = 'второй'
a[ 5 ] = 'пятый'

var out = ''
for (i= 0 ; i < a.length; i++)
{
  out += '\n i:' + i  + ' = ' + a[i]
}

alert( out )


результат:

i: 0  = undefined
i: 1  = первый
i: 2  = второй
i: 3  = undefined
i: 4  = undefined
i: 5  = пятый

Но это ещё полбеды... Попробуем удалить один элемент массива, допустим №2:

причём, если удалить посредством DELETE, элемент с ключём сохранится, но примет значение "undefined"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
delete a[ 2 ]

i: 0  = undefined
i: 1  = первый
i: 2  = undefined
i: 3  = undefined
i: 4  = undefined
i: 5  = пятый

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

Код: plaintext
1.
2.
3.
4.
5.
6.
a.splice ( 2 , 1 );

 i: 0  = undefined
 i: 1  = первый
 i: 2  = undefined
 i: 3  = undefined
 i: 4  = пятый


Кстати, есть решение, избавляющее массив от пустых (undefined) значений, но индексы, разумеется, так же сдвигаются:
(практическая реализация завета: и последние станут первыми..)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var arr = a.compact()

 i: 0  = первый
 i: 1  = пятый

// compact:

(function(A) {
    A.compact = function() {
        return this.filter(function(value) {
            return !!value;
        });
    };

})(Array.prototype);

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

Хочется верить, что есть готовое решение такой задачи. И хочется верить, что кто-то из присутствующих его знает)
...
Рейтинг: 0 / 0
php-шный массив для JS
    #36533561
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объект подойдёт?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
php-шный массив для JS
    #36533584
Фотография Пионэр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У объекта нет свойства length.

На самом деле мне этот массив нужен в качестве фичи для объекта, в частности для учёта объектов.
Например, создаём "массив" объектов и конструктор к нему:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
	function addChild(id, title, parent)
	{
		this.id = id
		this.parent = parent || 'top'
		this.title = title || 'no title'

  	this.child = new Array();
  	var i = obj[parent].child.length
	  obj[parent].child[i] = id;
	}

	var obj = new Object
	obj['top'] = new Object;
	obj['top'].child = new Array();

	obj['sub_1'] = new  addChild('sub_1','top', 'Уровень 1')
	obj['sub_2'] = new  addChild('sub_2', 'top',  'Уровень 2')
	obj['sub_3'] = new  addChild('sub_3', 'top', 'Уровень 3')

	obj['sub_3_1'] = new  addChild('sub_3_1', 'sub_3' , 'Уровень 3.1')
	obj['sub_2_1'] = new  addChild('sub_2_1', 'sub_2' , 'Уровень 2.1')


	alert(obj['top'].child.length)


Типа того. Я эту конструкцию уже пару лет юзаю, но нынче впервые наткнулся на баг, вызванный особенностями массивов в JS...
...
Рейтинг: 0 / 0
php-шный массив для JS
    #36533590
Фотография Пионэр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ps
сорри, написал не проверимши..

здесь ошибочка: addChild(id, title, parent)
должно быть: addChild(id, parent, title)

но это не суть..
...
Рейтинг: 0 / 0
php-шный массив для JS
    #36533676
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПионэрJS массив не сохраняет индексы, то есть ключи:
то есть, если создать такой вот массивчик из трёх элементов (1, 2, 5), то на самом деле мы будем иметь массив из шести элементов
...
Несомненно, такое поведение массива имеет свои плюсы, но хотелось бы иметь массив, в котором ключи сохраняются.
Хочется верить, что есть готовое решение такой задачи. И хочется верить, что кто-то из присутствующих его знает)
Все бы ничего, если бы не такой безапелляционный тон ...
Пионэр, очень мне сдается, что ты пока слабоват в азах js.

Если создаем "массивчик из трех элементов", то мы имеем "массивчик из трех элементов", а не из шести, просто индексы будут именно такими, какие мы указываем. А свойство length - это не количество элементов в массиве, а индекс последнего + 1.

Если выражаться абстрактно/фигурально/приблизительно, то коллекции в js могут быть представлены либо массивами, либо объектами (в текущем применении их еще называют "ассоциативными массивами", что в принципе не совсем корректно). Что выбрать - решать тебе. Согласен, что маловато, но чем богаты ... Наверное, наиболее удобным в данной ситуации было бы использовать массив объектов, но вроде как именно такую конструкцию ты и используешь.
...
Рейтинг: 0 / 0
php-шный массив для JS
    #36535860
Фотография Пионэр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну это же условный массив, это же известно: у объектов отсутствует свойство length, то есть невозможно работать как с "нормальным" массивом. А у "нормального" JS массива млять нет возможности задавать пару "ключ => значение"

авторНаверное, наиболее удобным в данной ситуации было бы использовать массив объектов, но вроде как именно такую конструкцию ты и используешь.

Я использую "массив" в кавычках из объектов, точнее "бутерброд" из объекта и массива, где в качестве колбасы идёт хэш-массив

Код: plaintext
1.
2.
var i = obj[parent].child.length
obj[parent].child[i] = id;

Но вопрос-то изначально стоял иначе:

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

В общем мне изначально думалось написать некий аналог пхп-шного массива, но ограничился более простым решением:

Для сохранения ключей (то есть индексов) достаточно во всех местах, где используется перебор значений делать проверку на " undefined ". А там, где нужно быстро измерить длину массива (count) - можно использовать compact (понимая, что индексы "съедут")

Ну и разумеется удаление элементов делать посредством delete а не slice. Тогда ключи гарантированно сохранятся.


зы

авторЕсли создаем "массивчик из трех элементов", то мы имеем "массивчик из трех элементов", а не из шести, просто индексы будут именно такими, какие мы указываем. А свойство length - это не количество элементов в массиве, а индекс последнего + 1.

Это как посмотреть.

Если ты вроде бы уверен, что у тебя в кармане три объекта, а на ощупь их оказывается шесть.....

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
a[ 1 ] = 'первый'
a[ 2 ] = 'второй'
a[ 5 ] = 'пятый'

var out = ''
for (i= 0 ; i < a.length; i++)
{
  out += '\n i:' + i  + ' = ' + a[i]
}

alert( out )


результат:

i: 0  = undefined
i: 1  = первый
i: 2  = второй
i: 3  = undefined
i: 4  = undefined
i: 5  = пятый



автор
Все бы ничего, если бы не такой безапелляционный тон ...
Пионэр, очень мне сдается, что ты пока слабоват в азах js.

Я программирую ad hoc, и для этого уровня вполне себе недурно. По крайней мере знаю свой уровень некомпетентности) Ну а тон.. хз.. Нормальный тон. (для человека, который внезапно обнаружил незапланированные объекты у себя в кармане я ещё спокоен..)
...
Рейтинг: 0 / 0
php-шный массив для JS
    #36535916
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напиши свою реализацию такого чудо-массива.
...
Рейтинг: 0 / 0
php-шный массив для JS
    #36535919
IDVsbruck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПионэравторЕсли создаем "массивчик из трех элементов", то мы имеем "массивчик из трех элементов", а не из шести, просто индексы будут именно такими, какие мы указываем. А свойство length - это не количество элементов в массиве, а индекс последнего + 1.

Это как посмотреть.

Если ты вроде бы уверен, что у тебя в кармане три объекта, а на ощупь их оказывается шесть.....

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
a[ 1 ] = 'первый'
a[ 2 ] = 'второй'
a[ 5 ] = 'пятый'

var out = ''
for (i= 0 ; i < a.length; i++)
{
  out += '\n i:' + i  + ' = ' + a[i]
}
alert( out )

результат:

i: 0  = undefined
i: 1  = первый
i: 2  = второй
i: 3  = undefined
i: 4  = undefined
i: 5  = пятый

И что? - Ты показал массив, в котором 3 элемента. Если бы было
i:0 = null
i:1 = первый
i:2 = второй
i:3 = null
i:4 = null
i:5 = пятый,
то это было бы 6 элементов.

С учетом поправки, что length - это не количество элементов в массиве, а индекс последнего + 1, то указав цикл до 1000, мы получили бы типа такого:
i:0 = undefined
i:1 = первый
i:2 = второй
i:3 = undefined
i:4 = undefined
i:5 = пятый
i:6 = undefined
...
i:998 = undefined
i:999 = undefined,
но сути не поменяет - элементов все равно только 3, undefined - не объект и даже не сущность, это "неопределенность" - undefined.


Для сложных задач также приходится извращаться и создавать сложную структуру и управление ею. К примеру, в твоем случае я бы делал структуру типа:
Код: plaintext
var structure = {length:XXX, set:{key1:value1, key2:value2, ...}};
Но все добавления, удаления и просмотры производить пользовательскими функциями: при добавлении увеличиваем length, при удалении - уменьшаем. Можно вместо объекта set делать массив объектов, где у всех объектов были бы одинаковые ключи (key_value, value_value), однако выборку значения по ключу приходилось бы делать перебором. С другой стороны, при сложных ключах (ключ может быть "по совместительству" не только ключом) это - правильное решение. Также его можно использовать, когда используется не хеш, а объект с набором свойств.
Если бы javascript был не однопоточным, то пришлось бы использовать неблокирующие механизмы управления (чтобы не возникало конфликтов при доступе к значению), но ограничения языка дают поблажку в простоте управления объектами.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / php-шный массив для JS
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]