Подтвердить что ты не робот

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, однако теперь я ставил под сомнение мои рассуждения с этой целью, поскольку методы могут быть доступны в другом месте. Спасибо заранее.

4b9b3361

Ответ 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/

Аргументы, которые получает функция, зависят от того, что вы повторяете. Если вы выполняете итерацию по массиву, вы получите элемент и индекс, если вы выполняете итерацию по объекту, тогда вы получите значение и ключ.