|
JavaScript / HTML Создание динамической разметки страниц |
20.10.2013, 12:50
|
#1
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Массив
Есть разреженный массив:
var array = []; array[10] =1; array[20] =2;
Если к массиву добавить свое свойство:
то
for(var key in array) console.log(key + ': ' + array[key]);
вернет все ключи включая свойства.
А теперь вопрос:
Есть ли оптимальный способ получить все элементы с их индексами из массива (без свойств), не перебирая весь массив таким образом:
props = []; for (var i = 0; i < object.length; i++) { if (object[i] !== undefined) { props.push({index: i, value: object[i]}) } }
|
(Offline)
|
|
20.10.2013, 12:59
|
#2
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Массив
Вообще присваивать свойства массиву - очень плохая затея, очень очень.
Если тебе нужно присвоить свойство, то тогда лучше подумай над враппером над массивом:
function list() {
this.a = [ ];
}
var l = new list();
l.prop = 'blahblah';
Да и разве перебирать элементы в массиве - это не то что ты хочешь?
Я не понял вопроса полностью, ты спрашиваешь как получить все индексы и значения, при этому не хочешь по ним пробегаться..
Лучше скажи чего ты хочешь добиться.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
21.10.2013, 01:47
|
#3
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: Массив
Мой пример выше находит всего два значения в массиве, но чтобы их получить надо перебрать 21 итерацию цикла (пройтись от 0 до 20).
В данный момент я пишу бинарную сериализацию (бинарный TCP протокол), и мне надо иметь аналог из C# типа Dictionary<byte,object>. Т.к. js уже имеет разреженные массивы из коробки, то мне хотелось их использовать для этой задачи. Свойство мне нужно, чтобы указать сериализатору, что данный массив надо сериализовать как коллекцию Dictionary<byte,object>. Собственно мой пример выше решает задачу, но вдруг есть решение оптимальнее.
Сейчас я это делаю так:
var object = {} //объект для сериализации
// сериализует как массив байтов object.arrayUInt8 = [1,2,255]; object.arrayUInt8.elementType = 'UInt8';
// сериализует как ассоциативный массив с ключем типа UInt8 object.arrayByteProps = []; object.arrayByteProps[10] = [1,2,3,4,5]; object.arrayByteProps[20] = {prop:12345}; object.arrayByteProps.elementType = 'ByteProps';
object.v3 = new Vector3();
var dBuff = new DynamicBuffer(); BinarySerializer.serialize(object, dBuff);
Со стороны C# я могу сейчас слать вот такие пакеты:
client.Send(new int[] { 1, 2, 3, 4, 5 }); client.Send(new string[] { "5", "4", "3", "2", "1" }); client.Send(new object[] { "5", null, 3, true, 1.1f, "привет!", new Vector3(5,3,1) }); client.Send(new Dictionary<string, object> { { "123", 123 }, { "Hi", "Привет" } }); client.Send(new Dictionary<byte, object> { { 10, 123 }, { 20, "Привет" } });
|
(Offline)
|
|
04.05.2014, 03:59
|
#4
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Массив
Как в jQuery/JS делается многомерный массив по типу блитзовского (dim (0,0)?
Где первый массив допустим id, а во втором массиве строки которые принадлежат к этому id, которых может быть от от 0 до N.
--upd---
Ответ оказался замудренным.
var arr = [0];
for (i=0; i<100; i++){
arr[i] = [0];
}
Но получается второй массив все же ограничен по элементам хотя в доках написано, что массивы динамически расширяются...
|
(Offline)
|
|
04.05.2014, 06:19
|
#5
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Массив
Есть два основных типа объектов для хранения "списков", индексированный (array) и key<>value (object).
Звучит что ты хочешь иметь ID как key, а value - массив.
Что-то типа:
var items = { };
items['id_1'] = [ ]; items['id_2'] = [ ]; items['another_id'] = [ ];
items['id_2'].push(8, 16, 42);
Массивы не ограничены, испольуй .push для добавления элементов.
Если ты пишешь v = [0] - то это создаст массив с 1 элементом, по 0му индексу.
|
(Offline)
|
|
05.05.2014, 08:31
|
#6
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Массив
Сообщение от moka
Есть два основных типа объектов для хранения "списков", индексированный (array) и key<>value (object).
Звучит что ты хочешь иметь ID как key, а value - массив.
Что-то типа:
var items = { }; items['id_1'] = [ ]; items['id_2'] = [ ]; items['another_id'] = [ ]; items['id_2'].push(8, 16, 42);
Массивы не ограничены, испольуй .push для добавления элементов.
Если ты пишешь v = [0] - то это создаст массив с 1 элементом, по 0му индексу.
|
Не то. Так получается просто два массива разных, а как вот сделать именно двумерный массив?
int[,] arr = new int[2, 3]
Где из [0,i] мы получим одни строки, из [1,i] другие... Взаимосвязь короче нужна.
В js такого нет и делается как то через .опу. И код что я выше добавил как то странно работает хотя по идее должен работать как двумерный массив.
|
(Offline)
|
|
05.05.2014, 10:31
|
#7
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Массив
Ты тупишь. То что я тебе предложил, является двумерным массивом где первый массив идёт по ID, а второй по индексу.
Если тебе двумерный массив с индексами 8x8 (64), то так:
var width = 8; var height = 8; var arr = [ ];
var y = height; while(y--) { arr[y] = [ ]; var x = width; while(x--) { arr[y][x] = Math.random(); } }
Доступ:
Но если у тебя фиксированной длины второй массив, то естественно лучше в один массив пихать, упаковывая линейно. На много лучше паковать.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:05.
|