Не совсем понятно зачем создавать псевдонимы для стандартных функций knockout. Видимо это синтаксический сахар для .NET разработчиков? Не проще ли просто провести внутри команды семинар по использованию библиотеки.
Для своего проекта мы использовали Backbone.JS, обернутый в knockout через knockback. По моему опыту, функции из underscore справляются с поиском по коллекциям быстрее, а синтаксис намного проще + они уже втроены во все коллекции Backbone.
Я бы назвал это — синтаксическим сахаром, чтобы .net разработчики быстрее осваивались в js среде.
Как ни крути, тяжело переходить с C# на js- по себе знаю- этот переход- огромный шок для человека.
Когда разработчик уже освоится, тогда он сам углубится и изучит.
Переход на сложный проект со множеством библиотек — это, безусловно, шок, согласен. Но больше проблем вызывает нестандартный, не документированный синтаксис, которого не найдешь в стандартных примерах для библиотек. Knowledge gap нужно преодолевать обучением, а не вставляя костыли туда, где они заведомо не принесут пользы.
Ваша правда, никаких конкретных цифр на руках нет. Есть лишь мнение ребят с другого проекта, которые с чистого knockout перешли на наш движок и отметили субъективное ускорение интерфейса. Повторюсь, это субъективно и это мое ИМХО.
Есть такой проект — knockout-projections, от автора Knockout (запись в блоге). В нем есть примерно то, что сделали вы. Не все, конечно. Но у него принцип работы другой — он не создает в памяти новые массивы, а проецирует лениво.
Как же не создается, строчка outputArray = [] там вполне себе в коде фигурирует.
Операция map там такая же, как и здесь. Принцип работы тот же самый — запоминается предыдущее состояние входного массива и выходного.
После сравнения массивов функция-аргумент пересчитывается только для вновь добавленного элемента.
У меня так же, как и там, операции навроде numbers.reverse() или numbers.splice(1, 1) не вызовут функцию аргумент ни разу, перестроив выходной массив ровно также, как и изменился входной. И моя простая, линейная и не создающая лишних сущностей реализация быстрее, как мне кажется.
А операция filter, как мне кажется, бессмысленна, поскольку сложность сравнения массивов O(N*M), а сложность полного перестроения массива — O(N). Вторая операция может стать затратнее первой, если внутри предиката что-то очень тяжелое, чего у нас в проекте пока не встречалось.
Собственно именно по этой причине есть Select, а не только Map.
А то, что сделал я, по большому счету, всего лишь инкапсуляция(+ грануляризация) часто повторяющихся кусков кода, ну и облечение их в приятную С#-разработчику оболочку.
Linq-подобный синтаксис для knockout