
Котяй Негодяй
10.09.2016
09:37:10
Оно генерируется или получается. Заранее известна только его длина.
О боже.
Забей.

Дмитрий
10.09.2016
09:38:00
Ну вот как получается тогда мап и делаешь.
reduce опять же.
В общем, у тебя очень странная задача. Тогда заполнение пустыми элементами, что уж

Google

Котяй Негодяй
10.09.2016
09:38:35
Задача очень тривиальная.

Дмитрий
10.09.2016
09:38:47
Да)

Котяй Негодяй
10.09.2016
09:41:59
Допустим, тебе нужно сгенерировать массив объектов. У объектов должны быть свойства, которые рассчитываются на основе индекса родителя в массиве. Писать
const items = [1, 2, 3, ...].map( ... );
не вариант, т.к. объектов может быть 100... 1000... Не-не, это уж слишком. Соответственно, тебе нужно сгенерировать последовательность.
Поэтому let usedItems = [1,2,3] здесь не катит.
Редъюз тоже.
Ну, хотя, написать специальный редъюсер — тоже красиво. Но бессмысленно.


Дмитрий
10.09.2016
09:46:15
function _map(fn, functor) {
var idx = 0;
var len = functor.length;
var result = Array(len);
while (idx < len) {
result[idx] = fn(functor[idx]);
idx += 1;
}
return result;
}
Это map из ramda, фактически твой случай, только уже написанный, ещё и максимально упрощённо. Уже с тестами, документацией и прочим.
Поэтому я не парюсь по такой фигне а просто пишу
const mapper = R.map(anyFunc)
let newArray = mapper(anyArray)
Незачем изобретать велосипед))
Можешь использовать его, тащемта

Котяй Негодяй
10.09.2016
09:48:18
Эммм... Очень сомневаюсь, что мне нужно подключать либу ради решения такой задачи. Я понимаю, если она сократит мой код на стопиццот строк, но она в данном случае сокращает всего лишь длину одной строки моего кода.

Дмитрий
10.09.2016
09:49:09
Такие вещи не длину сокращают, а время)

Котяй Негодяй
10.09.2016
09:49:28
Ну и велосипеда здесь нет. И времени я не затрачиваю больше.

Дмитрий
10.09.2016
09:49:43
Ты уже пол часа размышляешь))

Котяй Негодяй
10.09.2016
09:49:49
Я же не пишу никаких новых конструкций.

Google

Котяй Негодяй
10.09.2016
09:50:34
Ты думаешь, что подключаемые библиотеки существуют, чтобы избавить от необходимости думать? =) Нет. Это не так.

Дмитрий
10.09.2016
09:51:29
А для чего же ?
И тем не менее, почему тебя не устраивает
_map = func=>e=>e.map(func)
"Это уж слишком" — не ответ, родной map хотя бы движком соптимизируется
const mapper = _map((e,i)=>e+i)
let newArray = mapper(anyArray)

Котяй Негодяй
10.09.2016
09:52:45

Дмитрий
10.09.2016
09:53:26
Где то внутри V8, я хз где, пусть оно сам делается

Котяй Негодяй
10.09.2016
09:54:04
Ты в корне не понял задачу.
Задача — не обойти массив, а сгенерировать.

Дмитрий
10.09.2016
09:57:04
У объектов должны быть свойства, которые рассчитываются на основе индекса родителя в массиве
У тебя есть индекс родителя и функция-генератор (e,i)=>{}, это всё, что нужно для генерации нового массив
const items = new Array(count).fill(null)
.map(index => blaBlaBla(index));

Котяй Негодяй
10.09.2016
09:58:49

Дмитрий
10.09.2016
10:10:26

Котяй Негодяй
10.09.2016
10:11:08

Дмитрий
10.09.2016
10:15:15
А с точки зрения логики - у меня вот fatal error случился от маппинга ничего в массив %) Map это преобразование, к созданию его прикручивать противоестественно

Котяй Негодяй
10.09.2016
10:18:40
о.0
Какой код ты выполнил? =)

Дмитрий
10.09.2016
10:23:36
Ну мне оказалось достаточно просто прокрутить в голове))

Котяй Негодяй
10.09.2016
10:24:12
Ну, прокрутить в голове что? =)

マイク
10.09.2016
10:27:23

Google

マイク
10.09.2016
10:28:09
лан, позанудствовал, хватит

Дмитрий
10.09.2016
10:28:34
Ну, прокрутить в голове что? =)
new Array(count).fill(null).map(...)
Создаём массив ничего -> массив не трогаем, просто создаём индексы-> создаём нормальный массив
Ну вот где-то здесь я завис)) Смысл теперь ясен, но я бы так всё равно не писал, сто процентов %)

Котяй Негодяй
10.09.2016
10:29:11
Никаких ошибок — всё работает. =)
http://codepen.io/bigslycat/pen/vXNJmV?editors=0012

Ches
10.09.2016
11:06:10
в чем разница если определить метод в функции конструкторе или после через prototype?

Mikhail
10.09.2016
11:22:54
Там есть .times() если уж for писать слишком сложно

Котяй Негодяй
10.09.2016
11:26:24
В prototype метод создаётся 1 раз, а в конструкторе — каждый раз при вызове конструктора.

Mikhail
10.09.2016
11:28:48
ну там давно уже есть partial import

Mikhail
10.09.2016
11:29:02
import _times from 'lodash/times'

Котяй Негодяй
10.09.2016
11:32:03
Хм... Аргумент.
Спасибо.
class Times {
constructor(callback) {
this.callback = callback;
}
repeat(count) {
return new Array(count).fill(null).map(
(value, index) => this.callback(index)
);
}
}

Name
10.09.2016
13:05:09

Котяй Негодяй
10.09.2016
13:07:09
Ой, пардон. У меня тоже так было.

Google

Name
10.09.2016
13:18:42

Котяй Негодяй
10.09.2016
13:19:51

Name
10.09.2016
13:23:54
Я не понимаю, зачем нужен этот класс.

Котяй Негодяй
10.09.2016
13:36:14

Name
10.09.2016
13:37:22
Это от того, что я не парю и ем мясо

Котяй Негодяй
10.09.2016
13:37:37

Name
10.09.2016
13:38:07
Но зачем в данном случае нужна абстракция в виде класса?

Admin
ERROR: S client not available

Котяй Негодяй
10.09.2016
13:39:19

Name
10.09.2016
13:45:01
можно вынести это в npm модуль с названием из одной буквы, будет ещё короче
а в качестве заполняемых значений нового массива передавать не значение или функцию, а класс, так будет ещё удобнее

Котяй Негодяй
10.09.2016
13:55:39
А можно ещё выпить валерьянки.

Дмитрий
10.09.2016
13:56:46

Котяй Негодяй
10.09.2016
14:02:55
То есть fillWith() — это, по-сути, велик. Только более медленный.
Проще тогда просто писать
function fillWith(callback, count) { ... }

Дмитрий
10.09.2016
14:07:46
Это просто пример к "вызывать repeat() как мне вздумается"

Котяй Негодяй
10.09.2016
14:10:29
У тебя map, new, fill, анонимная функция с => внутри map, прототип, передача коллбэка, создание объекта и еще фигова тонна всего)
А функция должна иметь замыкание с конкретным fn в любом случае
Если написать твою fillWith() так же, но в виде класса, тио будет быстрее. Я не говорил, что конкретно моя реализация быстрее (она, в общем-то, на это и не претендует). Я говорил о том, что ты повёл себя непоследовательно — хотел оптимизировать, но допустил ошибку — твой код каждый раз будет делать работу, которую можно было сделать один раз.

Google

Котяй Негодяй
10.09.2016
14:14:06
Здесь repeat() создаётся только при объявлении класса. При создании его экземпляра, на repeat() создаётся ссылка в прототипе экземпляра.
В твоём примере анонимная функция создаётся столько раз, сколько ты вызываешь fillWith().

Дмитрий
10.09.2016
14:26:03
>так же, но в виде класса, тио будет быстрее
Хахах, увы, но нет)

Котяй Негодяй
10.09.2016
14:42:52
Ну ладно.

Damir
10.09.2016
15:06:52

Котяй Негодяй
10.09.2016
15:09:01
Babel полифилит fill?
Не знаю, что делает пакет babel-polyfill. Я использую babel только для синтаксиса. А для клиентских полифилов использую https://polyfill.io

Damir
10.09.2016
15:14:12

Котяй Негодяй
10.09.2016
15:14:56
А какие функции бабел полифилит при
presets: ['es2015', 'es2016', 'react']?

Damir
10.09.2016
15:19:20

Котяй Негодяй
10.09.2016
15:19:57

Damir
10.09.2016
15:20:15

Котяй Негодяй
10.09.2016
15:21:37
Я думал, бабел только при истользовании определённого пакета полифилит. Осторожнее. Проверь своё приложение на IE8.
https://cdn.polyfill.io/v2/polyfill.js?features=all
// setImmediate
(function (global, undefined) {
"use strict";
if (global.setImmediate) {
return;
}
...
Всё нормально он полифилит. С проверкой.

Damir
10.09.2016
15:29:22
Тема отличная, ещё бы доступ через npm и полифилы через browserlist

Котяй Негодяй
10.09.2016
15:30:24
Дада. Его. Я не пользуюсь им, т.к. есть сервис. Лучше буду тянуть меньше кода.
Так есть же npm-пакет. Ты почитай доку-то.
Они на селф-хостинг это распространяют в том числе.