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

时间:2014-05-28 20:52:43

标签: javascript backbone.js lodash

浏览Lo-Dash文档显示API属于以下类别:

  1. 阵列,
  2. Chaining,
  3. 收藏,
  4. 功能,
  5. 对象,
  6. 实用程序,
  7. 方法,
  8. 和属性
  9. 更详细地了解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的原因,我认为这是一个区别,但是,现在我正在质疑我的推理,因为这些方法可能在其他地方可用。提前谢谢。

2 个答案:

答案 0 :(得分:29)

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

  

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

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

答案 1 :(得分:10)

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

例如,这两项工作都是:

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

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

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