Lo-Dash,数组和集合之间的区别

aug*_*uag 32 javascript backbone.js lodash

浏览一下Lo-Dash文档,可以看出API属于以下类别:

  1. 阵列,
  2. 链接,
  3. 集合,
  4. 功能,
  5. 对象,
  6. 公用事业,
  7. 方法,
  8. 和属性

更详细地了解Arrays API,可以看到大约30种适用于数组的不同方法.

Collections API有比Arrays API更多的方法,它们不共享相同的方法.

在Collections API中,集合被描述为迭代的对象,可以是一个数组:

collection(Array | Object | string):要迭代的集合.

另外,有趣的是,有一个Collections API方法_.toArray从集合中返回一个数组:

参数

collection(Array | Object | string):要转换的集合.返回

(Array):返回新转换的数组.

有人会碰巧知道Lo-Dash API中数组和集合之间的形式差异吗?由于Backbone.js的原因,我认为这是一个区别,但是,现在我正在质疑我的推理,因为这些方法可能在其他地方可用.提前致谢.

Ber*_*rgi 32

查看更精细的Underscore.js文档是一个好主意,从中可以得出这种区别.它指出:

集合函数适用于数组,对象arguments和类似数组的对象,如NodeList等.但它通过duck-typing工作,因此避免使用numeric length属性传递对象.

基本上,"集合"是实现某种"可迭代"接口的东西,它们在内部使用相同的迭代方法(尽管Lodash源比Underscore更复杂).所有"集合方法"都可以在数组和对象(以及一些可迭代的东西)上工作,而数组方法只能在数组上使用(或者可能只使用带有.length和数字索引的所有东西),并且对象方法适用于任何对象.


mu *_*ort 11

所有数组都是集合,但并非所有集合都是数组.对象(即{k: v, ... })是不是数组的集合.许多迭代器可以很好地迭代非数组集合.在此上下文中,您可以将数组视为或多或少地由连续的非负整数索引的有序集合.

例如,这两个工作:

_([6, 11, 23]).each(function() {
    console.log(arguments);
});
_({ a: 6, b: 11, c: 23 }).each(function() {
    console.log(arguments);
});
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/ambiguous/t8a83/

函数得到的参数取决于你迭代的东西.如果你在一个数组上进行迭代,那么你将获得元素和索引,如果你在一个Object上进行迭代,那么你将获得值和键.