Извлечь значения массива с последней памятью извлечения при обратном вызове в JavaScript - PullRequest
0 голосов
/ 16 марта 2011

Допустим, у меня есть динамический массив, который заполняется при загрузке страницы с различным количеством строк внутри:

var arr = ["string1","string2","string3","string4","string5","string6","string7","string8","string9","string10","string11","string12","string13","string14","string15","string16","string17","string18"];

Затем у меня есть функция, которая вызывается для каждого события (скажем, щелчок), которыйНеобходимо последовательно возвращать 3 строки массива, помня, какое значение было прервано в последний раз, когда он был вызван.Итак:

При первом вызове функция возвращает:

string1, string2, string3

При втором вызове возвращается:

string4, string5, string6

и так далее ...

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

arr.runExtraction();

при каждом обратном вызове и возвращать нужные данные.

Ответы [ 2 ]

1 голос
/ 16 марта 2011
var arr = ["string1","string2","string3","string4","string5","string6","string7","string8","string9","string10","string11","string12","string13","string14","string15","string16","string17","string18"];

var runExtraction = function () {
  return arr.splice(0, 3);
}
1 голос
/ 16 марта 2011

Что должно произойти, если массив исчерпан? Начать с начала?

Вы могли бы сделать что-то вроде этого:

function get_iterator(values, steps, start) {
    steps = steps || 1;
    var current = start || 0,
        max = values.length;
    return function() {
        var end = current+steps,
            end = end > max ? max : end,
            t = values.slice(current, end);
        current = end % max;
        // or if you don't want to wrap around:
        // current = end; 
        return t;
    }
}

Редактировать: добавлен start параметр.

Поскольку current будет таким же, как values.length в конце, splice вернет пустой массив, если вы не обернетесь вокруг него.

Использование slice не изменит исходный массив.

А потом

var extract = get_iterator(arr, 3);
var arr1 = extract(); // gives you the first three elements
var arr2 = extract(); // gives you the next three elements etc.

DEMO

Это может дать вам меньше элементов в «последнем» извлечении, если количество элементов не делится на количество извлеченных элементов. Следующий вызов позволит начать все сначала. Вы также можете изменить его так, чтобы он оборачивался и брал элементы с самого начала, чтобы он всегда возвращал столько элементов, сколько вы указали.

Ссылка : Array.prototype.slice

...