Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.07.2011, 19:12
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Array each function
требуется быстрая функция для обхода массива, исполняя на каждой итерации функцию. Должна быть возможность прервать цикл.

пока смог реализовать через замыкание.

для чего это мне понадобилось, покажу на абстрактных примерах

порядок обхода совершенно безразличен. я могу сделать reverse, если что.
Пример: через замыкание
function each(arr, func) {

var al = arr.length, breaked = false;

do 
    func( arr[al],  al , arr, function(){ breaked=true } );

while (    al-- > 0  &&   breaked==false    ) 

}

var log=[];

each( [1,2,3,"break it",4,5,6,7],    function(a,b,c,d){

                                                         log.push(a);
                                                         a==='break it' && d();
} );

alert( "Прошли : \n\n"+ log.join("\n") )


сильно хочется сделать это через метки, но не могу.

подскажите, пожалуйста, как лучше всего сделать функцию обхода массива с возможностью прерывания

Последний раз редактировалось melky, 10.07.2011 в 19:46.
Ответить с цитированием
  #2 (permalink)  
Старый 10.07.2011, 19:28
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от melky
как лучше всего сделать функцию обхода массива с возможностью прерывания
Взять обычную и выбросить исключение.
Ответить с цитированием
  #3 (permalink)  
Старый 10.07.2011, 19:44
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

кажется, сам не стал бы так писать да?

Пример: через исключение
var log=[];

try { 
        [1,2,3,"break it",4,5,6,7].forEach ( function(a){ 

                        log.push(a);
                         if(  a==='break it' ) throw "";

                       } );
 } catch (e) {}

alert( "Прошли : \n\n"+ log.join("\n") )
Ответить с цитированием
  #4 (permalink)  
Старый 10.07.2011, 20:05
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Я, наверное, что-то не очень понял...

_log=[];
arr=[1, 2, 3, 4, 5, false, 6, 7];
function each(arr, func) {
 for (var i=0; i!= arr.length; ++i) {
  _log.push(arr[i]);
  if(func(arr[i], i, arr)===false) break;
};
};
each(arr, function(a, b, c){if (a===false) return false});
alert(_log);


Нет?
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)

Последний раз редактировалось trikadin, 10.07.2011 в 20:15.
Ответить с цитированием
  #5 (permalink)  
Старый 10.07.2011, 20:17
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от melky
как лучше всего сделать функцию обхода массива с возможностью прерывания
Стандартные some/every.
Ответить с цитированием
  #6 (permalink)  
Старый 10.07.2011, 20:25
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

И для кроссбраузерности:

Array.prototype.every= Array.prototype.every || function (func, thisObj) {
for (var i=0; i!= this.length; ++i)
 if (i in this && func.call(thisObj, this[i], i, this))
   return false;
 return true;
};


Ну и some так же...
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)

Последний раз редактировалось trikadin, 10.07.2011 в 21:11.
Ответить с цитированием
  #7 (permalink)  
Старый 10.07.2011, 20:38
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от trikadin
if (!Array.every)
Сначала не там ищем метод, потом заменяем существующий на неправильную реализацию.
Ответить с цитированием
  #8 (permalink)  
Старый 10.07.2011, 20:46
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Сообщение от Kolyaj Посмотреть сообщение
Сначала не там ищем метод, потом заменяем существующий на неправильную реализацию.
=)
Как это типично...))
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 10.07.2011, 20:54
Аватар для trikadin
Модератор
Отправить личное сообщение для trikadin Посмотреть профиль Найти все сообщения от trikadin
 
Регистрация: 27.04.2010
Сообщений: 3,417

Поправил, виноват...
__________________
Читайте:
Ты любопытный) Всё-таки, ничему в этом мире не помешает хорошая доля юмора)
Как спросить, чтобы вам ответили
Часто Задаваемые Вопросы (FAQ)
Ответить с цитированием
  #10 (permalink)  
Старый 10.07.2011, 21:00
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Ещё нужна проверка i in this, и callback функция не обязана возвращать строго false.

http://alljs.ru/s/files/Array.js
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
$('my').load(); Как сделать, чтобы это заработало mycoding Общие вопросы Javascript 25 02.10.2016 23:43
2 function в 1 LAV45 AJAX и COMET 5 27.07.2011 14:49
Многомерный массив в json Л_Денис Общие вопросы Javascript 1 21.04.2010 21:43
CComponent - кроссбраузерные компоненты tenshi Ваши сайты и скрипты 5 20.04.2010 23:22
Свойства посредством полиморфных функций tenshi Ваши сайты и скрипты 0 18.03.2010 17:12