Lo-Dash, разница между массивом и коллекцией
Взгляд на документы Lo-Dash показывает, что API относится к категориям:
- Массивы,
- Цепочка,
- Коллекции,
- Функции,
- Объекты,
- Утилиты,
- Методы,
- и свойства
Более подробный обзор API-интерфейсов Arrays показывает примерно 30 различных доступных методов, применимых к массивам.
API Collections имеет несколько методов, чем API-интерфейс Arrays, и они не используют одни и те же методы.
Внутри API коллекций коллекция описывается как объект, который повторяется и может быть массивом:
collection (Array | Object | string): коллекция для итерации.
Кроме того, интересно, существует метод API коллекций _.toArray
, который возвращает массив из коллекции:
Аргументы
collection (Array | Object | string): коллекция для преобразования. Возвращает
(Array): возвращает новый преобразованный массив.
Может ли кто-нибудь узнать формальное различие между массивом и коллекцией в Lo-Dash API? Я был под презумпцией, что это была разница из-за Backbone.js, однако теперь я ставил под сомнение мои рассуждения с этой целью, поскольку методы могут быть доступны в другом месте. Спасибо заранее.
Ответы
Ответ 1
Это хорошая идея, чтобы посмотреть на более сложную документацию Underscore.js, из которой получено это различие. В нем указано:
Функции коллекции работают с массивами, объектами и подобными массиву объектами, такими как arguments
, NodeList и т.п. Но он работает с помощью утиного ввода, поэтому избегайте передачи объектов с числовым свойством length
.
В принципе, "коллекции" - это вещи, которые реализуют какой-то "итерируемый" интерфейс, и они используют один и тот же метод итерации (хотя источник Lodash немного более запутан, чем Underscore). Все "методы сбора" работают как на массивах, так и на объектах (и еще несколько повторяющихся вещей), в то время как методы массива должны использоваться только на массивах (или, возможно, на всех с .length
и числовых индексах), а также на методах объектов на любых объектах.
Ответ 2
Все массивы - это коллекции, но не все коллекции - это массивы. Объект (т.е. {k: v, ... }
) представляет собой набор, который не является массивом. Многие итераторы могут очень легко перебирать коллекции не-Array. В этом контексте вы можете рассматривать массивы как более или менее упорядоченные коллекции, индексированные последовательными неотрицательными целыми числами.
Например, обе эти работы:
_([6, 11, 23]).each(function() {
console.log(arguments);
});
_({ a: 6, b: 11, c: 23 }).each(function() {
console.log(arguments);
});
Демо: http://jsfiddle.net/ambiguous/t8a83/
Аргументы, которые получает функция, зависят от того, что вы повторяете. Если вы выполняете итерацию по массиву, вы получите элемент и индекс, если вы выполняете итерацию по объекту, тогда вы получите значение и ключ.