|
|
|
php-шный массив для JS
|
|||
|---|---|---|---|
|
#18+
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. Но это ещё полбеды... Попробуем удалить один элемент массива, допустим №2: причём, если удалить посредством DELETE, элемент с ключём сохранится, но примет значение "undefined" Код: plaintext 1. 2. 3. 4. 5. 6. 7. А если его вырезать, то он пропадёт навовсе, однако все ключи сдвинутся.. То еть, то что было пятым , станет вдруг четвёртым.. Код: plaintext 1. 2. 3. 4. 5. 6. Кстати, есть решение, избавляющее массив от пустых (undefined) значений, но индексы, разумеется, так же сдвигаются: (практическая реализация завета: и последние станут первыми..) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Несомненно, такое поведение массива имеет свои плюсы, но хотелось бы иметь массив, в котором ключи сохраняются. Хочется верить, что есть готовое решение такой задачи. И хочется верить, что кто-то из присутствующих его знает) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2010, 21:17:37 |
|
||
|
php-шный массив для JS
|
|||
|---|---|---|---|
|
#18+
Объект подойдёт? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2010, 21:54:41 |
|
||
|
php-шный массив для JS
|
|||
|---|---|---|---|
|
#18+
У объекта нет свойства 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. Типа того. Я эту конструкцию уже пару лет юзаю, но нынче впервые наткнулся на баг, вызванный особенностями массивов в JS... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2010, 22:40:34 |
|
||
|
php-шный массив для JS
|
|||
|---|---|---|---|
|
#18+
ps сорри, написал не проверимши.. здесь ошибочка: addChild(id, title, parent) должно быть: addChild(id, parent, title) но это не суть.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.03.2010, 22:51:59 |
|
||
|
php-шный массив для JS
|
|||
|---|---|---|---|
|
#18+
ПионэрJS массив не сохраняет индексы, то есть ключи: то есть, если создать такой вот массивчик из трёх элементов (1, 2, 5), то на самом деле мы будем иметь массив из шести элементов ... Несомненно, такое поведение массива имеет свои плюсы, но хотелось бы иметь массив, в котором ключи сохраняются. Хочется верить, что есть готовое решение такой задачи. И хочется верить, что кто-то из присутствующих его знает) Все бы ничего, если бы не такой безапелляционный тон ... Пионэр, очень мне сдается, что ты пока слабоват в азах js. Если создаем "массивчик из трех элементов", то мы имеем "массивчик из трех элементов", а не из шести, просто индексы будут именно такими, какие мы указываем. А свойство length - это не количество элементов в массиве, а индекс последнего + 1. Если выражаться абстрактно/фигурально/приблизительно, то коллекции в js могут быть представлены либо массивами, либо объектами (в текущем применении их еще называют "ассоциативными массивами", что в принципе не совсем корректно). Что выбрать - решать тебе. Согласен, что маловато, но чем богаты ... Наверное, наиболее удобным в данной ситуации было бы использовать массив объектов, но вроде как именно такую конструкцию ты и используешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.03.2010, 01:48:19 |
|
||
|
php-шный массив для JS
|
|||
|---|---|---|---|
|
#18+
Ну это же условный массив, это же известно: у объектов отсутствует свойство length, то есть невозможно работать как с "нормальным" массивом. А у "нормального" JS массива млять нет возможности задавать пару "ключ => значение" авторНаверное, наиболее удобным в данной ситуации было бы использовать массив объектов, но вроде как именно такую конструкцию ты и используешь. Я использую "массив" в кавычках из объектов, точнее "бутерброд" из объекта и массива, где в качестве колбасы идёт хэш-массив Код: plaintext 1. 2. Но вопрос-то изначально стоял иначе: хотелось бы иметь массив, в котором ключи сохраняются (при изменении массива, в частности при удалении элементов) В общем мне изначально думалось написать некий аналог пхп-шного массива, но ограничился более простым решением: Для сохранения ключей (то есть индексов) достаточно во всех местах, где используется перебор значений делать проверку на " 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. автор Все бы ничего, если бы не такой безапелляционный тон ... Пионэр, очень мне сдается, что ты пока слабоват в азах js. Я программирую ad hoc, и для этого уровня вполне себе недурно. По крайней мере знаю свой уровень некомпетентности) Ну а тон.. хз.. Нормальный тон. (для человека, который внезапно обнаружил незапланированные объекты у себя в кармане я ещё спокоен..) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 01:09:53 |
|
||
|
php-шный массив для JS
|
|||
|---|---|---|---|
|
#18+
Напиши свою реализацию такого чудо-массива. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 02:43:15 |
|
||
|
php-шный массив для JS
|
|||
|---|---|---|---|
|
#18+
ПионэравторЕсли создаем "массивчик из трех элементов", то мы имеем "массивчик из трех элементов", а не из шести, просто индексы будут именно такими, какие мы указываем. А свойство length - это не количество элементов в массиве, а индекс последнего + 1. Это как посмотреть. Если ты вроде бы уверен, что у тебя в кармане три объекта, а на ощупь их оказывается шесть..... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. И что? - Ты показал массив, в котором 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 Если бы javascript был не однопоточным, то пришлось бы использовать неблокирующие механизмы управления (чтобы не возникало конфликтов при доступе к значению), но ограничения языка дают поблажку в простоте управления объектами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2010, 02:47:05 |
|
||
|
|

start [/forum/topic.php?fid=22&msg=36533584&tid=1453346]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
192ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 475ms |

| 0 / 0 |
