Мастер-классы по Javascript, AJAX/COMET, jQuery Узнать больше...
Javascript.RU

Массивы

Javascript поддерживает два вида структуры "массив":

  1. Ассоциативный массив (хеш), где данные хранятся по произвольному ключу.
    Об этом читайте в разделе Объекты.
  2. Числовой массив Array, где данные хранятся по номерам.
    Он описан в этой статье.

Javascript - очень гибкий язык, поэтому технически в Array можно хранить произвольные ключи, как в Object - числовые. Но лучше использовать типы по назначению.

Для хранения данных по номеру предназначен тип Array.

var arr = new Array()
arr.test = 5
arr[1] = "blabla"
...

В типе Array есть специальные методы, ориентированные именно на работу с числовыми ключами.

Есть два эквивалентных способа создания массива:

var a = new Array()
var a = []

Или, сразу со значениями

var a = new Array("a", 1, true)
var a = ["a", 1, true]

Эти способы работают одинаково, кроме объявления вида new Array(10), когда у конструктора есть единственный аргумент-число.

Такое объявление создаст пустой массив (все элементы undefined) длиной 10. По возможности, не используйте new Array.

Отсчет элементов начинается с нуля:

alert(a[0])   // => "a"

Массив хранит данные по численным ключам, но внутри он использует точно такой же хэш (ту же структуру данных), как и обычный объект, поэтому можно сделать так:

var a = []
a[1] = 1
a[999999] = 2

и массив a будет занимать память, нужную для хранения этих двух соответствий, а не займет длинный непрерывный кусок памяти, как это произошло бы в языке С.

У каждого массива есть свойство length, которое автоматом меняется при каждом обновлении массива. Длина массива - это не количество элементов, а максимальный целый ключ + 1:

alert(a.length) // всего 2 элемента, но выведет 1000000

Добавлять новый элемент можно эквивалентными вызовами

a[a.length] = "new element"
a.push("new element")

Перебор элементов обычно (когда индексы непрерывные) осуществляется простым циклом:

var arr = [ "array", "elements", "here" ]
for(var i=0; i<arr.length; i++) {
  ... сделать что-то с arr[i] ...
}

Если индексы - с разрывами, то перебор осуществляется так же, как в объектах:

var arr = []
arr[1] = 123
arr[9999] = 456

for(var i in arr) {
    if (!arr.hasOwnProperty(i)) continue;
   ... сделать что-то с arr[i] ...
}

В массиве есть всё необходимое, чтобы работать с ним как с очередью или со стеком, или и с тем и другим одновременно.

Методы push и pop добавляют или вынимают значение с конца массива

var arr = [3,5,7]
arr.push(9)
var last = arr.pop()    //= 9
var last = arr.pop()   // = 7
alert(arr.length)   // = 2

Методы shift/unshift делают то же самое, с начала массива.

var arr = [4,6,8]
arr.unshift(2) // arr = [2,4,6,8]
arr.unshift(0) // arr = [0,2,4,6,8]
var last = arr.shift() // last = 0, arr = [2,4,6,8]
arr.shift()  // arr = [4,6,8]

shift/unshift обычно приводят к перенумерации всего массива. shift сдвигает все элементы на единицу влево, а unshift - вправо. Поэтому на больших массивах эти методы работают медленнее, чем push/pop.

Массив

slice(begin[, end])

Возвращает подмассив с индексами begin…end.

splice(index, deleteCount[, element1,…, elementN])

Удалить deleteCount элементов, начиная с index, и вставить на их место element1…elementN

Есть и еще много методов:

  • join
  • reverse
  • ...

О них можно почитать на английском, например, в http://developer.mozilla.org/en/..Array


Автор: Гость (не зарегистрирован), дата: 15 октября, 2008 - 18:44
#permalink

Видел конструкцию типа:

a = new array(
{"attr1":"text1","attr2":"text2"}
{"attr1":"text3","attr2":"text4"}
);

Поясните, что это такое?


Автор: Илья Кантор, дата: 15 октября, 2008 - 20:58
#permalink

new Array() - это создание массива из аргументов.
Например, new Array(1,2,3) - массив из трех элементов: 1,2,3, такой же как и [1,2,3].

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

{ свойство1: значение1, свойство2:значение2 }

Подробнее об объектах и задании объектов - см. Объекты Javascript в примерах.


Автор: Гость (не зарегистрирован), дата: 5 января, 2009 - 23:34
#permalink

А удалять массивы нужно и как вообще очистить существующий массив наиболее коректно?


Автор: Илья Кантор, дата: 31 октября, 2009 - 07:00
#permalink

Javascript автоматически очищает память, как и Java, в отличие от C/C++, поэтому вы можете присвоить переменной новый массив:

arr = [ ]

При этом старый объект-массив будет удален в процессе "сборки мусора".


Автор: zm8, дата: 24 марта, 2009 - 10:49
#permalink

Разрешите поинтересоваться, чем плох

var someArray = [];
/* бравые действия */
someArray = null;


Для последующей инициализации массива ещё раз объявляем его с ключевым словом var.
----------------------------------------
window.open(window.location);


Автор: betaev (не зарегистрирован), дата: 6 октября, 2009 - 17:28
#permalink

переменная удаляется только в том случае, когда перестаёт существовать замыкание в котором они объявлены, а оно перестаёт существовать, как выполнится соответствующая функция и исчезнут все ссылки на эту переменную вне замыкания.
повторное определение "var x" абсолютно ничего не даст, если в этом замыкании уже существует переменная "x".


Автор: Гость (не зарегистрирован), дата: 16 апреля, 2009 - 16:19
#permalink

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


Автор: Леонид Евстигнеев, дата: 27 мая, 2009 - 17:08
#permalink

Обычно это делается созданием массива каждый элемент которого тоже массив.


Автор: Леонид Евстигнеев, дата: 27 мая, 2009 - 17:12
#permalink

Насчёт создания массивов

var a = new Array(10)
var a = [10]

Это далеко не эквивалентные строчки.
Первая создаст массив с длинной в десять элементов.
А вторая массив с одним элементом содержащим значением 10.
Это факт при незнании может приводить к логической ошибке.


Автор: Гость (не зарегистрирован), дата: 3 июня, 2009 - 13:56
#permalink

Люди помогите : " Размер массива определяет количество ... в массиве "
Вместо точек какое слово ставиться , плз помогите


Автор: Леонид Евстигнеев, дата: 3 июня, 2009 - 15:02
#permalink

Элементов.


Автор: proxima (не зарегистрирован), дата: 9 декабря, 2009 - 13:25
#permalink

Парень, ты что - тест сдавал? Какой-то слишком очевидный вопрос! Или плохо читал статью, или лучше займись чем-то кроме программирования.


Автор: Гость (не зарегистрирован), дата: 14 июля, 2009 - 09:57
#permalink

насколько я понял из статьи, в JavaScript массив - это не отдельный тип данных, а просто разновидность объекта? То есть если объект создаётся как ar = {}, то его можно считать ассоциативным массивом, ключи которого есть свойства и методы объекта, а если ar = [] или ar = new Array(), то это объект-массив-список + плюс к нему добавляются методы для работы с массивом-списком. Это правильные выводы?


Автор: Илья Кантор, дата: 7 октября, 2009 - 13:16
#permalink

Да, выводы правильные. При этом, если вы сделали массив Array - не рекомендуется использовать его как ассоциативный Object.


Автор: Гость (не зарегистрирован), дата: 27 октября, 2009 - 18:04
#permalink

Есть массив с прерывистыми индексами идущими не по порядку:

arr[25]     = 1;
arr[8]       = 2;
arr[1099]  = 3;

Вопрос: как пройти по этому массиву в порядке создания и при этом не сбросить ключи? Т.е. мне нужно получить все знаения в том порядке в котором они созданы (1, 2, 3) при этом внутри цыкла я должен знать ключ.
Если делаю for (var i in arr) { ... } - почему то перед проходом массив сортируется по ключу и обход идёт в порядке: 2, 1, 3.
Была мысль попробовать while ( var v = unshift(arr) ) { ... } но тогда я не узнаю индексы.


Автор: Vital (не зарегистрирован), дата: 31 октября, 2009 - 00:09
#permalink

подозреваю, что вы пользуетесь браузером Google Chrome версии 1 или 2, именно в них замечен подобный глюк, во всех остальных браузерах, включая Google Chrome 3, проход по массиву через for (.. in .. ) производится в том порядке, в котором элементы в этот массив помещены


Автор: merzaff (не зарегистрирован), дата: 26 июня, 2010 - 06:13
#permalink

Это конечно не ответ на твой вопрос, но можно сделать так:

var array = [];

array.push({25:1});
array.push({8:2});
array.push({1099:3});
//or array = [{25:1},{8:2},{1099:3}]

for (var i=0; i < array.length; i++) {
   console.log(array[i])
}

Автор: Yazla, дата: 24 ноября, 2009 - 13:38
#permalink

Скажите пожалуйста, если использую массив для хранения обьектов, то перед удалением массива надо обнулить все ссылки внутри?
То есть так:

for (var i = 0; i<arr.length; i++)
     arr[i] = null
arr = [];

Или обнулять каждый елемент не обязательно?

Спасибо.


Автор: subzey, дата: 24 ноября, 2009 - 17:05
#permalink

Не нужно. Просто задайте arr новое значение. Сборщик мусора сделает все за Вас.

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

Кстати, оптимизируя память, обратите внимание на области данных (как по-русски назвать то, что на этом сайте именутеся {{scope}}?).
Пример:

var myHugeArray = Array(10000000000000000000000);

function deleteArray(){
var myHugeArray = null;
}

deleteArray();

Этот пример вовсе не удалит массив, а создаст новый элемент myHugeArray в области deleteArray, который успешно умрет когда функция отработает, т.е., сразу же.


Автор: Гость (не зарегистрирован), дата: 6 декабря, 2009 - 16:58
#permalink

подскажите пжл как мне задать двумерный массив(в виде матрицы) чтоб элементы задавались random...если можно то попроще))


Автор: subzey, дата: 7 декабря, 2009 - 18:58
#permalink

Создать массив массивов. Если еще актуально.


Автор: Гость (не зарегистрирован), дата: 14 декабря, 2009 - 20:05
#permalink

подскажите что я делаю не так....мне нужно ввести матрицу размера n на n случайным образом....

n=prompt("Введите н","");
Math.random(10);
var v=new Array(Math.random());
for(i=0;i');


Автор: Гость (не зарегистрирован), дата: 6 января, 2010 - 01:01
#permalink

Скажите, а что должно происходить в этом случае:

ar1=["tutu"];

function (){
let ar2 = [];
ar2["a1"]="aa";
ar2["a2"]="bb";
ar1=ar2;
return ar2;
}

что вернёт функция? Что после её отработки будет в ar1?


Автор: B@rmaley.e><e (не зарегистрирован), дата: 6 января, 2010 - 16:03
#permalink

Пожалуй, ничего. Этот код вызовет ошибку синтаксиса.


Автор: Гость (не зарегистрирован), дата: 28 января, 2010 - 21:44
#permalink

Скажите, как найти индекс элемента в массиве?


Автор: B@rmaley.e><e, дата: 28 января, 2010 - 21:58
#permalink

В новых браузерах есть метод indexOf (как у строки).
Для остальных нужно что-то вроде

if(!Array.prototype.indexOf)
	Array.prototype.indexOf = function(searchElement, fromIndex){
		for(var i = fromIndex||0, length = this.length; i<length; i++)
			if(this[i] === searchElement) return i;
		return -1
	};

Автор: Гость (не зарегистрирован), дата: 28 января, 2010 - 22:41
#permalink

Значит, IE6 уже не новый... Впрочем, это и так ясно. Спасибо.


Автор: Леколь (не зарегистрирован), дата: 20 марта, 2010 - 11:17
#permalink

В офф-лайн справочнике раздел Массив имеет "корявые" строки:
- - -
Методы
pop Удаляет последний элемент массива и возвращает урезанный массив
push Добавить элемент в конец массива
shift Удаляет первый элемент массива и возвращает удалённый элемент.
- - -
Надо бы поправить. И изложить примерно так:
- - -
pop возвратить последний элемент массива и уменьшить размер массива на 1;
push добавить элементы в конец массива и вернуть новую длину массива;
- - -
ммм?


Автор: Гость (не зарегистрирован), дата: 12 апреля, 2010 - 14:51
#permalink

а как удалить элемент массива зная его значение


Автор: B@rmaley.e><e, дата: 12 апреля, 2010 - 17:05
#permalink

Найти индекс и удалить как обычный.

var myArr = [3,4, 5.32, 'val', 'value3', 'value'];
delete myArr[myArr.indexOf('value')];
alert(myArr)

P.S. Только indexOf не всеми браузерами поддерживается, поэтому для некоторых придется писать свою версию.


Автор: lahmatiy (не зарегистрирован), дата: 13 апреля, 2010 - 19:48
#permalink

Мне кажется, что Вы дали не совсем корректный совет. Потому как delete удалит ключ из массива (индекс), само значение тоже "пропадает", но длина массива от этого не изменится (кстати вас не смутила запятая в конце?).
Полное удаление будет выглядеть так:

var myArr = [3,4, 5.32, 'val', 'value3', 'value'];
myArr.splice(myArr.indexOf('value'), 1);
alert(myArr);

Для удаления с конца массива больше подойдет myArr.pop(), а с начала myArray.shift().


Автор: bayah (не зарегистрирован), дата: 22 апреля, 2010 - 07:47
#permalink

Господа, есть вопрос:
Мне нужно создать двумерный массив с двумя параметрами. Я делаю это создавая двумерный массив n на 2. То есть n - число элементов. А 2 - собственно место для двух параметров. Написал я вот так.

var buffer_a = new Array()
...

buffer_a.push(new Array(true, 'id'))
 
alert(alert(buffer_a[0][0]+' '+buffer_a[0][1]))
buffer_a.pop
alert(alert(buffer_a[0][0]+' '+buffer_a[0][1]))

При первом вызове alert выдает, то же что и при втором, то есть я так понимаю, pop не удаляет элемент и при абсолютной адресации я опять получу его значение. Как тогда определить мне количество элементов?

buffer_a.lenght почему-то выдает undefined

Подскажите я вообще правильно делаю все? Может есть способ сделать проще?


Автор: bayah (не зарегистрирован), дата: 22 апреля, 2010 - 08:17
#permalink

Пардон, это я length неправильно написал.)
Ну все равно, насчет способа реализации. Может есть проще?


Автор: bayah (не зарегистрирован), дата: 22 апреля, 2010 - 14:23
#permalink

Еще вопрос, товарищи, как определить индекс по элементу в двумерном массиве. Например так:

a = new Array()
a[0] = new Array(1, 2)
a[1] = new Array(2, 3)
...

Теперь как мне найти индекс массива с элементом (2, 3). indexOf я так понимаю не поможет здесь?


Автор: гость Артём (не зарегистрирован), дата: 18 мая, 2010 - 13:54
#permalink

подскажите, почему она s выдает как строку, а не считает сумму?

<МЕТА content="text/html; charset=windows-1251" http-equiv="Content-Type">

var d =new Array();
for(i=0;i<5;i++)
{

d[i]=prompt("Введите число","");

document.write ("d["+i+"]="+d[i]+"");
}

alert ("сейчас будет хрень") ;
var s=1;
for(i=0;i<5;i++)
{
s+=d[i];
}
document.write("summ="+s);


Автор: Гость (не зарегистрирован), дата: 20 мая, 2010 - 10:50
#permalink

Попробуй
d[i] = parseInt(prompt(...) || '0');


Автор: BlackScorp (не зарегистрирован), дата: 18 мая, 2010 - 18:01
#permalink

Поиск индекса свойства по его значению или определение индекса многомерного масива по значению.

Object.prototype.indexOf=function(value){
	var index=new Array()
	for(prop in this)
	{
		if(prop!="indexOf")
		{
			index=[];
			if(this[prop]===value)
			{
				if(arguments.length>1)
				{
					for(var i=0;i<arguments[1].length;i++)
						index.push(arguments[1][i]);
				}
				index.push(prop);
			 	return index;
			}
			if(arguments.length>1)
			{
				for(var i=0;i<arguments[1].length;i++)
					index.push(arguments[1][i]);
			}
			index.push(prop);
			index=this[prop].indexOf(value,index);
		}
	}
	return index;
}

Автор: BlackScorp (не зарегистрирован), дата: 18 мая, 2010 - 18:04
#permalink

Точнее

Object.prototype.indexOf=function(value){
	var index=new Array()
	for(prop in this)
	{
		if(prop!="indexOf")
		{
			index=[];
			if(arguments.length>1)
			{
				for(var i=0;i<arguments[1].length;i++)
					index.push(arguments[1][i]);
			}
			index.push(prop);
			if(this[prop]===value)
			{
			 	return index;
			}
			index=this[prop].indexOf(value,index);
		}
	}
	return index;
}

Автор: Гость (не зарегистрирован), дата: 12 июня, 2010 - 01:27
#permalink

Народ, подскажите нубу
Opera, IE, Chrome, Safari глотают эту функцию,
а Firefox не хочет, в чём дело?

function parseTable(v) {
var tbls =document.getElementById('table_tr');
for (var r=0; r


Автор: Гость (не зарегистрирован), дата: 12 июня, 2010 - 01:30
#permalink

Народ, подскажите нубу
Opera, IE, Chrome, Safari глотают эту функцию,
а Firefox не хочет, в чём дело?

function parseTable(v) {
var tbls =document.getElementById('table_tr');
  for (var r=0; r<tbls.rows.length; r++) {
 for (var c=0; c<tbls.rows[r].cells.length; c++) {
var cls = tbls.rows[r].cells[c];
if (cls.innerText==v) cls.style.background = "yellow";
else cls.style.background = "white";
}}
}

Ссори, не правильно оформил первый пост.


Автор: Гость (не зарегистрирован), дата: 14 августа, 2010 - 18:53
#permalink

Потому что вместо cls.innerText в FireFox нужно использовать cls.textContent


Автор: Гость (не зарегистрирован), дата: 13 июня, 2010 - 18:30
#permalink

Никак не пойму как определить длинну ассоциативного массива. С обычным массивом без ключей фу-ия length работает нормально....а вот с ассоциативным массивом трабл выходит =/

вот пример:

var test = new Array();

test['one'] = 1;
test['two'] = 2;

//дальше идет определение кол-ва элементов в массиве

$('printDiv').innerHTML = + "Кол-во элементов:" + test.length;
<div id="printDiv"></div>

в итоге в браузере отображается undefined!!! =/ Что я неправильно делаю ? =)


Автор: aldr61 (не зарегистрирован), дата: 13 июня, 2010 - 20:44
#permalink


var nelem = 0
for(var i in arr) { nelem++ }

Может так? У меня работает...


Автор: merzaff (не зарегистрирован), дата: 26 июня, 2010 - 07:13
#permalink

По идее, когда мы пишем

test['one'] = 1;
test['two'] = 2;

это эквивалентно

test.one = 1;
test.two = 2;

Получается, что Вы прибавляете к объекту типа Array новые свойства.
по идее в ваше примере длинна как была ноль (когда вы объявляли new Array()) так и осталась равной нулю, так как написав "test['one'] = 1;" вы не положили данные в массив, а создали новое свойство у объекта test.

15.4 Объекты Array

Сам тип Array это не ассоциативный массив, а обычный индексный массив.
Ассоциативные массивы в javascript заменяют объекты

var o = {} // or new Object()
o.one = 1     // одно
o["one"] = 1  //  и тоже

Автор: Гость (не зарегистрирован), дата: 27 августа, 2010 - 16:30
#permalink

почему a!=b при
a = new Array(1,2,3)
b = new Array(1,2,3)
?


Автор: Илья Кантор, дата: 28 августа, 2010 - 02:40
#permalink

Потому что любые два разных объекта не равны (пункт стандарта 11.9.3).

alert([] == [])

Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
5 + 2 =
Введите результат. Например, для 1+3, введите 4.
 
Новости

Открылась регистрация на мастер-классы по профессиональному Javascript, AJAX/COMET, jQuery в городах:

  • Ярославль (24-25 сентября)
  • Новосибирск (3-4 октября)
  • Казань (9-10 октября)
  • Минск (16-17 октября)
  • Днепропетровск (23-24 октября)
  • Одесса (30-31 октября)
  • Самара (13-14 ноября)

Более подробно - на странице мастер-классов.

Если вас интересует другой город - посмотрите здесь, выбрав "Другие города".

Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Статьи и мероприятия

Будьте в курсе наших последних новостей!

Последние обсуждения на форуме
Forum
Последние комментарии