Я думаю, что мой самый большой вопрос касается параметра "итератор". Я предполагаю, что он принимает функцию. Должен ли я предоставить параметры для этой функции?
// Call iterator(value, key, collection) for each element of collection.
// Accepts both arrays and objects.
_.each = function(collection, iterator)
{
if (typeof collection=='object')
{
for(let i=0; i<Object.keys(collection).length; i++)
{
iterator(collection[i],Object.keys(collection)[i],collection);
}
}
else
{
for(let i=0; i<collection.length; i++)
{
iterator(collection[i],i,collection);
}
}
};
Оба lodash и подчеркивания относятся к этому в качестве iteratee не итератора. Вероятно, это поможет избежать путаницы с итераторами JavaScript.
Итерируемый - это функция, которая будет вызываться для вас. Вы определили функцию, и each
будет вызывать ее для каждого элемента в коллекции. Документация скажет вам, как должна выглядеть подпись функции. Например, underscore
будет передаваться (element, index, list)
в функцию для каждого элемента. Вам решать написать функцию и решить, что делать с этими параметрами.
Например из Лодаша:
_.forEach([1, 2], function(value) {
console.log(value);
});
Итерируемый является анонимной функцией, которая использует только параметр value
.
for (iteratee of someCollection)
. Вместо этого на самом деле это операция (или ее часть), выполняемая над этим элементом - действуя как тело цикла, если хотите. Мне не нравится ни iteratee
или iterator
для имени здесь. Но у меня также нет предложений для чего-то лучшего - называть вещи - одна из двух трудностей в информатике .
next()
. Однако вы, возможно, не говорите о протоколе итерации, как определено в ES6 - у библиотеки вполне может быть свой собственный итератор, который на самом деле является функцией. Или объект, но для него требуются разные методы / подписи. Трудно сказать, не зная точно, о чем вы говорите - пожалуйста, добавьте соответствующую информацию, такую как ссылки, документацию или код, к своему вопросу.