Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Веб-программирование > JavaScript / HTML

JavaScript / HTML Создание динамической разметки страниц

Ответ
 
Опции темы
Старый 20.10.2013, 12:50   #1
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Массив

Есть разреженный массив:
var array = [];
array[
10] =1;
array[
20] =2
Если к массиву добавить свое свойство:

array.prop 'Property' 
то
for(var key in array) console.log(key ': ' + array[key]); 
вернет все ключи включая свойства.

А теперь вопрос:
Есть ли оптимальный способ получить все элементы с их индексами из массива (без свойств), не перебирая весь массив таким образом:
props = [];

for (var 
0object.lengthi++) {
    if (
object[i] !== undefined) {
        
props.push({indexivalueobject[i]})
    }

__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 20.10.2013, 12:59   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Массив

Вообще присваивать свойства массиву - очень плохая затея, очень очень.
Если тебе нужно присвоить свойство, то тогда лучше подумай над враппером над массивом:
function list() {
  this.a = [ ];
}
var l = new list();
l.prop = 'blahblah';
Да и разве перебирать элементы в массиве - это не то что ты хочешь?
Я не понял вопроса полностью, ты спрашиваешь как получить все индексы и значения, при этому не хочешь по ним пробегаться..

Лучше скажи чего ты хочешь добиться.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
pax (21.10.2013)
Старый 21.10.2013, 01:47   #3
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 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(objectdBuff); 
Со стороны C# я могу сейчас слать вот такие пакеты:
client.Send(new int[] { 1234});
client.Send(new string[] { "5""4""3""2""1" });
client.Send(new object[] { "5"null3true1.1f"привет!", new Vector3(5,3,1) });
client.Send(new Dictionary<stringobject> { { "123"123 }, { "Hi""Привет" } });
client.Send(new Dictionary<byteobject> { { 10123 }, { 20"Привет" } }); 
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 04.05.2014, 03:59   #4
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 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
moka
.
 
Регистрация: 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(81642); 
Массивы не ограничены, испольуй .push для добавления элементов.
Если ты пишешь v = [0] - то это создаст массив с 1 элементом, по 0му индексу.
(Offline)
 
Ответить с цитированием
Старый 05.05.2014, 08:31   #6
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 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(81642); 
Массивы не ограничены, испольуй .push для добавления элементов.
Если ты пишешь v = [0] - то это создаст массив с 1 элементом, по 0му индексу.
Не то. Так получается просто два массива разных, а как вот сделать именно двумерный массив?
int[,] arr = new int[23
Где из [0,i] мы получим одни строки, из [1,i] другие... Взаимосвязь короче нужна.
В js такого нет и делается как то через .опу. И код что я выше добавил как то странно работает хотя по идее должен работать как двумерный массив.
(Offline)
 
Ответить с цитированием
Старый 05.05.2014, 10:31   #7
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Массив

Ты тупишь. То что я тебе предложил, является двумерным массивом где первый массив идёт по ID, а второй по индексу.
Если тебе двумерный массив с индексами 8x8 (64), то так:

var width 8;
var 
height 8;
var 
arr = [ ];

var 
height;
while(
y--) {
  
arr[y] = [ ];
  var 
width;
  while(
x--) {
    
arr[y][x] = Math.random();
  }

Доступ:
arr[y][x] == ... 
Но если у тебя фиксированной длины второй массив, то естественно лучше в один массив пихать, упаковывая линейно. На много лучше паковать.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 14:59.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com