Jump to content
  • 0

массив


odalex
 Share

Question

в jQuery есть замечательная штука $.each, а как на чистом javascript`е узнать позицию первого элемента в массиве, если он не нулевой а 3й например или 500й....знаю про pop и push но они же выдергивают содержимое первого а не его позицию в массиве

в пхп есть замечательные комманты reset и end, а что делать в яваскрипте?

Link to comment
Share on other sites

10 answers to this question

Recommended Posts

  • 0

в Java Script нет понятия ассоциативного массива, как в РНР. в Java Script объект Array() подразумевает нумерованные индексы. а Object использует понятие имени свойcтва. то есть Array() это тот же Object() только с нумероваными именами свойств, но использует несколько иной интерфес доступа к своему содержимому.

for (var i in test) {alert(i);}

Link to comment
Share on other sites

  • 0
подразумевает нумерованные индексы

А ведь когда-то во времена динозавров массивов вообще не было, и объект под каждо? сво? свойство создавал заодно и индекс. Про запас. :)

netscape.gif

если он не нулевой а 3й например или 500й

Если речь о массиве, то перебором по индексам с помощью 'for', 'while' и т.п. Перебираем и спрашиваем, есть ли такое свойство/индекс у массива. Конструкцию 'for-in' можно применить и к массиву, но это не гарантирует нужный вам порядок, задействует наследуемые свойства и проч.:

Object.prototype.x = 'preved';
var a = [0];
a[2] = 2;
a[1] = 1;
for (var i in a) {
alert(i); //-> у каждого браузера свой порядок (x, 0, 2, 1 или 0, 2, 1, x ...)
}

Link to comment
Share on other sites

  • 0

>>Yarik Voronov: подразумевает нумерованные индексы.

>Zeroglif ведь когда-то во времена динозавров массивов вообще не было, и объект под каждо? сво? свойство создавал заодно и индекс. Про запас. :)

В те времена меня еще не было в мире интернета :) собственно не знал...

>>odalex: если он не нулевой а 3й например или 500й

>Zeroglif: Если речь о массиве, то перебором по индексам с помощью 'for', 'while' и т.п. Перебираем и спрашиваем, есть ли такое свойство/индекс у массива.

Имхо, слишком "долго"... тут в свете вопроса "каково же значение индекса у первого элемента нетипичного массива с учетом того что у каждого браузера свой порядок расположения элементов и того что этот индекс заранее не известен" надо поскать про pop(), unshift() и подумать

>Zeroglif: Конструкцию 'for-in' можно применить и к массиву, но это не гарантирует нужный вам порядок, задействует наследуемые свойства и проч.[...] у каждого браузера свой порядок (x, 0, 2, 1 или 0, 2, 1, x ...)

а может сразу определить в прототипе функцию сортировки от а-я, 0-8 (первая пришедшая в голову мысль, обычно не самая верная) :)

Link to comment
Share on other sites

  • 0
В те времена меня еще не было в мире интернета :) собственно не знал...

В мире я уже был, но javascript тогда ш?л от меня лесом... дремучим... :)

Имхо, слишком "долго"...

'for-in' никак не отдаст точно первый/500-тый/последний элемент, перебор ид?т абы как, 'for-in' мог бы подойти, если бы массив был очень большой, очень сильно разреженный, очень правильно построенный (по порядку и без лишних свойств). Во всех остальных случаях 'for-in' обычно проигрывает, в том числе и по скорости.

а может сразу определить в прототипе функцию сортировки от а-я, 0-8 (первая пришедшая в голову мысль, обычно не самая верная) :P

Для обычного объекта? Object.prototype трогать нежелательно, отсортировать объект можно и через Array.prototype.sort, другой вопрос, зачем это нужно, мне казалось, что изначально вопрос стоял именно о разреженном массиве (термины: "позиция", "элемент", "нулевой"), а иначе, если не о массиве, то зачем в обычном объекте искать позицию... :)

Link to comment
Share on other sites

  • 0

Честно скажу - я толком не понял, что именно искал автор темы, т.к. сначала он, вроде, "просил много", а потом согласился на for in. Тем не менее, предположу (хочется принять участие), что искал он вот это:

Array:indexOf

Array:lastIndexOf.

Но, опять же честно, я не понимаю, зачем это может понадобиться...

Link to comment
Share on other sites

  • 0

мой вопрос был поставлен не корректно

я просил то чего в яваскрипте нету

"в Java Script нет понятия ассоциативного массива"

я конвертирую в json массив с числовыми индексами 3, 15, 35

в итоге мой json на клиенте превращается в обьект со свойствами вида 5, 15, 35..

но я это не заметил сразу

корректнее вопрос звучал бы так - "как узнать имя первого свойства обьекта"

вообще задумка была такая что бы уменьшить размер передаваемого json кода за счет использования индекса элемента массива в качестве `ид` этого элемента, но учитывая реалии яваскрипта нифига это к экономии не ведет, легче уже

array(

0 => 3, //ID

1 => 'xxxx', //param1

2 => 'yyyy'); //param2

использовать и спокойно обращатся к первому элементу яваскрипт массива arr[0]

мысли об экономии начали приходить вместе с 100килобайтным json ответом сервера :)

Link to comment
Share on other sites

  • 0
я просил то чего в яваскрипте нету

"в Java Script нет понятия ассоциативного массива"

Прошу прощеня за неверную информацию. Есть такое понятие. т.е. можно создать

var test = [];
test['index1'] = 0;
test['500'] = 10;
test['index2'] = 3;

но попутешествовав по ссылке, данной AKS, покурив доки, я уяснил, что данный способ использовать не рекомендуется, так как для таких случаев предназначена конструкция типа Object(); а использовав Array() можно получить неожиданный результат

Честно скажу - я толком не понял, что именно искал автор темы

Возьму на себя смелость попытаться разъяснить

<script language="javascript" type="text/javascript">
var myTest1 = [];
myTest1[0]=6;
myTest1[1]=3;
myTest1[2]=2;
alert([typeof(myTest1), myTest1.length,myTest1.toString()]);

var myTest2 = [];
myTest2[3] = 2;
myTest2[500] = 6;
myTest2[700] = 4
alert([typeof(myTest2),myTest2.length,myTest2.toString()]);

for (var a=[],i=0, e=myTest2.length; i<e; i++) {
if (myTest2[i]!=null) a.push(myTest2[i]);
}
alert([typeof(myTest2),a.length,a.toString()]);
</script>
<?php
$myTest2 = array();
$myTest2[3] = 2;
$myTest2[500] = 6;
$myTest2[700] = 4;
while (list($key, $val)=each($myTest2)) print "myTest2[$key] : $val
";
// myTest2[3] : 2
// myTest2[500] : 6
// myTest2[700] : 4
print "Размерность myTest: ".count($myTest2); // Размерность myTest: 3
?>

Так вот в РНР автоматически будет создан ассоциативный массив с числовым значением индекса. длиной 3.

* * *

А вот в JS размерность массива будет увеличена до 701, причем 697 значений этого массива будут равны null (это для odalex).

поэтому правильнее использовать массив типа, например myTest = [ {ID: 0, param1: ' ', param2: ' '} ]. или конструкцию типа Object() (Например, myTest = {ID:[ ], param1:[ ], param2:[ ]} ). но я собственно решения odalex не оспариваю :)

Link to comment
Share on other sites

  • 0
Есть такое понятие. т.е. можно создать

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

Возьму на себя смелость попытаться разъяснить

Спасибо, я примерно понял после повторного объяснения автора. Также понял, что автор силен в поисках приключений (это я о 100килобайтном json ответе). :)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy