Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Array each function (https://javascript.ru/forum/misc/18666-array-each-function.html)

melky 10.07.2011 19:12

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") )


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

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

B@rmaley.e><e 10.07.2011 19:28

Цитата:

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

Взять обычную и выбросить исключение.

melky 10.07.2011 19:44

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

Пример: через исключение
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") )

trikadin 10.07.2011 20:05

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

_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);


Нет?

Kolyaj 10.07.2011 20:17

Цитата:

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

Стандартные some/every.

trikadin 10.07.2011 20:25

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

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 так же...

Kolyaj 10.07.2011 20:38

Цитата:

Сообщение от trikadin
if (!Array.every)

Сначала не там ищем метод, потом заменяем существующий на неправильную реализацию.

Aetae 10.07.2011 20:46

Цитата:

Сообщение от Kolyaj (Сообщение 112752)
Сначала не там ищем метод, потом заменяем существующий на неправильную реализацию.

=)
Как это типично...))

trikadin 10.07.2011 20:54

Поправил, виноват...

Kolyaj 10.07.2011 21:00

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

http://alljs.ru/s/files/Array.js


Часовой пояс GMT +3, время: 02:24.