【问题标题】:What is the reason to use lodash / underscore .map() function?使用 lodash / underscore .map() 函数的原因是什么?
【发布时间】:2017-03-17 15:13:19
【问题描述】:

在我当前的项目中,我可以看到许多 _.map() 用法几乎相同,如下例所示:

var a = [1,2,3,4,5,6,7,8];
var lodashMap = _.map(a, i => {
  if (i < 5) return i-1;
});

而且我看不出有任何理由不使用像这样的内置 Array.map() 方法:

var arrayMap = a.map(i => {
  if (i < 5) return i-1;
});

我知道这些都不会改变原始数组,并确保结果完全相同:https://codepen.io/anon/pen/xqPMNQ

由于我们使用的是 Typescript,lodash 版本丢失了i 参数类型,所以我想改用Array.map()Array.map_.map() 之间有什么我不知道的区别吗?

【问题讨论】:

  • Underscore/LoDash 早于Array.prototype.map() 的广泛使用。
  • 旧版浏览器不实现 Array.prototype.map 所以 lodash 是一种适用于新旧浏览器的 pollyfill!
  • 所以我们的项目目标是 es5 我可以使用Array.map,谢谢澄清!
  • 一个区别是_.map可以用在类数组对象上,而如果你想在类数组对象上调用Array#map,你需要使用尴尬的Array.prototype.map.call(obj, ...)或者[].map.call(obj, ...)。差别不大,但_.map 更灵活。另外,_.map() 可以用于普通对象,Array#map 不能。

标签: javascript arrays underscore.js lodash


【解决方案1】:

就您那里的示例而言,这两个选项之间没有有效区别,您使用a.map() 也一样好。

但是,_.mapArray#map 之间存在一些差异。

一个是它可以直接在类数组对象上调用。 (使用Array#map 这样做需要将函数附加到对象然后调用它,或者使用.call() 的笨拙方法。)

示例:

var mapped = _.map(document.getElementsByTagName('li'), el => el.textContent);

console.log(mapped);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
<ul><li>A</li><li>B</li><li>C</li></ul>

您也可以在非数组对象上使用_.map。这是Array#map 根本做不到的。

示例:

var myObj = { a: 1, b : 2 };
var mapped = _.map(myObj, (val, key) => key + val);

console.log(mapped);
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"&gt;&lt;/script&gt;

它也可以在null 上使用而不会引发错误(它只是返回一个空数组)。根据你的看法,你可能认为这是好事还是坏事,但它与原生的.map 有显着区别。

示例:

var myObj = null;
var mapped = _.map(myObj, (val, key) => key + val);

console.log(mapped);
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"&gt;&lt;/script&gt;

除此之外,如果您将它与许多其他 lodash/underscore 函数结合使用,那么一致性的好处就是。

另外,_.map 可以用在下划线/lodash 链中。

示例:

var values = [{ value: 10 }, { value: 2 }, { value: 13 }, { value: 7 }];
var result =  _.chain(values)
                .map(_.property('value'))
                .filter(v => v > 5)
                .sortBy()
                .value();
                
console.log(result);
  
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"&gt;&lt;/script&gt;

【讨论】:

  • 另一个非常重要的事情是,如果应该保存数组的变量是null,lodash 不会失败 - 它会返回空数组。对于本地人,您必须提防这种情况。
  • @wojtiku 谢谢,我不知道。我已将其添加到我的答案中。
猜你喜欢
  • 2015-09-21
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2017-02-06
  • 2020-08-07
  • 1970-01-01
  • 2017-04-10
  • 2017-06-22
相关资源
最近更新 更多