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") ) сильно хочется сделать это через метки, но не могу. подскажите, пожалуйста, как лучше всего сделать функцию обхода массива с возможностью прерывания |
Цитата:
|
кажется, сам не стал бы так писать :) да?
Пример: через исключение
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") ) |
Я, наверное, что-то не очень понял...
_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); Нет? |
Цитата:
|
И для кроссбраузерности:
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 так же... |
Цитата:
|
Цитата:
Как это типично...)) |
Поправил, виноват...
|
Ещё нужна проверка i in this, и callback функция не обязана возвращать строго false.
http://alljs.ru/s/files/Array.js |
Часовой пояс GMT +3, время: 02:24. |