Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.09.2011, 21:21
Профессор
Отправить личное сообщение для alerzo Посмотреть профиль Найти все сообщения от alerzo
 
Регистрация: 23.12.2010
Сообщений: 222

массив на js
добрый день!
решил написать js по работа с массивом но не знаю с чего начать
подскажите где можно почитать по данному вопросу
вообщем что я хочу сделать
есть массив вида
слово;число
слово1;число1
слово2;число2
и т.д
мне нужно чтобы при каждом обращении к скрипту в переменную "а" записывалось "слово" а в переменную "b" соответствующее ей "число" и при следующем обращении эта пара уже не бралась. символы вместо букв и чисел будут любые..это так пример..
кто может помогите буду очень благодарен за любую подсказку
Ответить с цитированием
  #2 (permalink)  
Старый 23.09.2011, 22:26
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Iterator pattern. ну надо же, наконец то я его попробую.


function Itr(source, onnext, startInd) {
    // что будет просчитывать
    this.source = source;
    // при изменении указателя будет вызываться эта функция
    this.onnext = typeof onnext == "function" ? onnext : function() {};
    // указатель
    this.index = typeof startInd == "number" ? startInd : 0;
};

Itr.prototype = {
    
    // изменить указатель на "delta" единиц и породить псевдособытие "next"
    
    // delta :
    // >0 - вправо, <0 - влево. (сдвиг указателя)
    change: function(delta) {
        
        var ob = this;


        if (ob.index + delta in ob.source) {


            ob.onnext(ob.source[ob.index += delta]);

            return ob.current();

        } else return undefined;


    },
    
    //обёртки для change
    next: function() {
        return this.change(1);
    },
    previous: function() {
        return this.change(-1)
    },
    
    
    // получить текущий элемент итератора
    current: function() {
        return this.source[this.index]
    }
};





вроде организовано всё сложно, но оно всё просто, на самом деле

Itr итерирует не только массивы, но и пронумерованные объекты вообще.

что это такое ?

к примеру, это
obj = {
    "0" : "первый член",
    "1" : "второй член"
}

свойство, показывающее длину, не нужно! Spoiler : (проверка существования сделана отлично от цикла по массиву - я про длину).

чтобы создать итератор, можно написать так.

var myIterator = new Itr( myIterateObject/*что будет итерировать*/ );

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

функция current сдвигает указатель на N единиц и порождает пседособытие next.
index = index + delta


методы next и current сдвигают указатель на 1 и -1 соответственно. (т.е. вызывают функцию change такими аргументами)

чтобы получить текущий элемент итератора, можно вызвать метод current.

ну и наконец, тестовые примеры

пример с использованием всех аргументов.
function Itr(a,b,c){this.source=a;this.onnext=typeof b=="function"?b:function(){};this.index=typeof c=="number"?c:0}Itr.prototype={change:function(a){if(this.index+a in this.source)return this.onnext(this.source[this.index+=a]),this.current()},next:function(){return this.change(1)},previous:function(){return this.change(-1)},current:function(){return this.source[this.index]}};
/* -------  SCRIPT  END    ---------*/


// что будем считать
var arr = ["слово;число", "слово1;число1", "слово2;число2"];

// откуда будем считать

// т.к. начальный указатель - нуль, а "next" немедленно передвинет указатель вправо,
// то ставим -1, чтобы при "next" он стал нулём.  
var startIndex = -1;

// ваши переменные a и b
var a,b;

// обработчик псевдособытия. вызывается при изменении указателя.
// передается текущий элемент
var handler = function(current) {
    
    var c = current.split(";");
    
    a = c[0]; // "слово"
    b = c[1]; // "число"
    
    alert( "a = "+a+", b = "+b );
}

    
var ex = new Itr(arr,handler,startIndex);
// этого хватит для итерации, если всё указано :)
while( ex.next() ) ;


и пример с использованием без дополнительных аргументов.
function Itr(a,b,c){this.source=a;this.onnext=typeof b=="function"?b:function(){};this.index=typeof c=="number"?c:0}Itr.prototype={change:function(a){if(this.index+a in this.source)return this.onnext(this.source[this.index+=a]),this.current()},next:function(){return this.change(1)},previous:function(){return this.change(-1)},current:function(){return this.source[this.index]}};
/* -------  SCRIPT  END    ---------*/


// что будем считать
var arr = ["слово;число", "слово1;число1", "слово2;число2"];


// ваши переменные a и b
var a,b;


    
var ex = new Itr(arr);

// опять таки ставим индекс в минус один
ex.index = -1;


while( ex.next() ) {

    var c = ex.current().split(";");
    
    a = c[0]; // "слово"
    b = c[1]; // "число"
    
    alert( "a = "+a+", b = "+b );

}

Последний раз редактировалось melky, 23.09.2011 в 22:50.
Ответить с цитированием
  #3 (permalink)  
Старый 26.09.2011, 10:21
Профессор
Отправить личное сообщение для da_ff Посмотреть профиль Найти все сообщения от da_ff
 
Регистрация: 12.05.2009
Сообщений: 317

Помоему два первых поста не сильно коррелируют между собой.
P.S. Ага! Надо было расскрыть последний кусок кода!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
преобразовать php массив в массив js zebulun Общие вопросы Javascript 12 01.09.2011 23:49
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 18:14
Подскажите, как вернуть js-скрипт массив Polkan AJAX и COMET 18 30.04.2010 22:30
Как передать массив из PHP в js (AJAX) Александр Иванов Общие вопросы Javascript 7 10.09.2009 09:22
Как создать ассоциативный массив JS + CSS occlusion Общие вопросы Javascript 3 12.01.2009 08:19