Lodash,npm包仓库中依赖最多的库

简介

lodash,是具有一致接口、模块化、高性能等特性的 JavaScript 工具库。提供了大量的工具函数,也正是因为这个原因,使得lodash成为了npm包库中被其它库依赖最多的库。

就像jQuery在全部函数前加全局的$一样,lodash使用全局的_来提供对工具的快速访问。

var _ = require(‘lodash‘);

提高开发者效率

//copy一个JS对象

//原生方法
var a = {a:1,b:2,c:3};
var b = {};
for(var key in a) {
  b[key] = a[key];
}

//lodash方法
var b = _.clone(a);

只用一个方法、一行代码就可实现对JS对象的复制。

但在这里,lodash的高效率特性并没有体现出来

var a = {};
//创建一个元素数目较多的对象,否则复制时间太小,统计不精确
for(var i=0;i<1000000;i++) {
  a[i.toString()] = Math.floor(Math.random()*100000);
}

var b = {};
//console.time(label);
//console.timeEnd(label);
//两者一一对应,用于统计两者之间的代码运行时间
console.time(‘native copy‘);
for(var key in a) {
  b[key] = a[key];
}
console.timeEnd(‘native copy‘);

var c = {};
console.time(‘lodash clone‘);
c = _.clone(a);
console.timeEnd(‘lodash clone‘);

运行结果:

native copy: 473ms
lodash clone: 581ms

提高程序运行效率

但在大多数情况下,lodash提供的工具函数是可以显著提高程序运行效率的。

var array = [];
//生成一个100w 长度的数组,并赋值随机数
for(var i=0;i<1000000;i++) {
  array.push(Math.floor(Math.random()*10000))
}

//原生forEach 遍历
console.time(‘native for Each‘);
array.forEach(function (key) {

});
console.timeEnd(‘native for Each‘);

//lodash forEach 遍历
console.time(‘lodash for Each‘);
_.forEach(array,function (key) {

});
console.timeEnd(‘lodash for Each‘);

运行结果:

native for Each: 32ms
lodash for Each: 11ms

可看到运行速度降低了近三倍。不知是否电脑环境、软件版本不同的原因,在别人的电脑上的运行结果出现过

native for Each: 98ms
lodash for Each: 4ms

速度相差近了25倍。

惰性计算

lodash可以显著提高计算效率的原因在于其对惰性计算的应用。

惰性求值,是一个计算机编程中的一个概念,它的目的是要最小化计算机要做的工作。

又称延迟计算,特别用于函数式编程语言。表达式不在它被绑定到变量之后就立即求值,而是在该值被取用的时候求值,也就是说,语句如x:=expression; (把一个表达式的结果赋值给一个变量)明显的调用这个表达式被计算并把结果放置到x中,但是先不管实际在x中的是什么,直到通过后面的表达式中到x的引用而有了对它的值的需求的时候,而后面表达式自身的求值也可以被延迟,最终为了生成让外界看到的某个符号而计算这个快速增长的依赖树。

下面看一个简单的延迟计算例子,一个简单取余的函数。

function mod (a,b){
    if(b==1) return 0;
    else return a % b ;
}

mod((1+3)*2,1)  // 0

可以看到由于 b 是 1,所以我们并不会用到 a 的值,但是依然计算了表达式(1+3)*2,这里的计算就是浪费的。惰性求值则能避免这一情况。

看下面这份代码:

var arr = _.range(100);

var a = _.chain(arr)
    .map(function (x) {
        console.log(1);
        return x+1;
    })
    .take(10)
    .value();

结果会输出100个1。

为什么会这样?不是说在lodash中采用了惰性求值吗?不应该输出10个1吗?

原来,在lodash中只有数组超过200个才会启动惰性求值。

var arr = _.range(200);

var a = _.chain(arr)
    .map(function (x) {
        console.log(1);
        return x+1;
    })
    .take(10)
    .value();

这样,输出就会是10个1了。

lodash常用工具函数

  • 循环
// 1. Basic for loop.
for(var i = 0; i < 5; i++) {
    // ....
}

// 2. Using Array‘s join and split methods
Array.apply(null, Array(5)).forEach(function(){
    // ...
});

// Lodash
_.times(5, function(){
    // ...
});
  • 迭代数组并返回每一项中深度嵌套的属性
// Fetch the name of the first pet from each owner
var ownerArr = [{
    "owner": "Colin",
    "pets": [{"name":"dog1"}, {"name": "dog2"}]
}, {
    "owner": "John",
    "pets": [{"name":"dog3"}, {"name": "dog4"}]
}];

// Array‘s map method.
ownerArr.map(function(owner){
    return owner.pets[0].name;
});

// Lodash
_.map(ownerArr, ‘pets[0].name‘);
  • 在指定范围内获取一个随机值
// Get a random number between 15 and 20.

// Naive utility method
function getRandomNumber(min, max){
    return Math.floor(Math.random() * (max - min)) + min;
}

getRandomNumber(15, 20);

// Lodash
_.random(15, 20);

Lodash中的random方法要比上面的原生方法更强大与灵活。你可以只传入一个参数作为最大值, 你也可以指定返回的结果为浮点数。

_.random(20); // Return random number between 0 to 20
_.random(15, 20, true); // Return random floating numbers between 15 and 20
  • 从列表中随机的选择列表项
var luckyDraw = ["Colin", "John", "James", "Lily", "Mary"];

function pickRandomPerson(luckyDraw){
    var index = Math.floor(Math.random() * (luckyDraw.length -1));
    return luckyDraw[index];
}

pickRandomPerson(luckyDraw); // John

// Lodash
_.sample(luckyDraw); // Colin

也可指定返回元素的个数

var luckyDraw = ["Colin", "John", "James", "Lily", "Mary"];

// Lodash - Getting 2 random item
_.sample(luckyDraw, 2); // [‘John‘,‘Lily‘]
  • 从某个对象中选择部分属性组成新的对象
// Naive method: Returning a new object with selected properties
Object.prototype.pick = function(arr) {
    var _this = this;
    var obj = {};
    arr.forEach(function(key){
        obj[key] = _this[key];
    });

    return obj;
};

var objA = {"name": "colin", "car": "suzuki", "age": 17};

var objB = objA.pick([‘car‘, ‘age‘]);
// {"car": "suzuki", "age": 17}

// Lodash
var objB = _.pick(objA, [‘car‘, ‘age‘]);
// {"car": "suzuki", "age": 17}
  • 去掉对象的某些属性
// Naive method: Remove an array of keys from object
Object.prototype.remove = function(arr) {
    var that = this;
    arr.forEach(function(key){
        delete(that[key]);
    });
};

var objA = {"name": "colin", "car": "suzuki", "age": 17};

objA.remove([‘car‘, ‘age‘]);
objA; // {"name": "colin"}

// Lodash
objA = _.omit(objA, [‘car‘, ‘age‘]); // {"name": "colin"}
时间: 2024-10-11 01:42:19

Lodash,npm包仓库中依赖最多的库的相关文章

编写一个供浏览器端使用的NPM包

此文已由作者吴维伟授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在编写程序时,总会有一些代码是我们不愿意一遍又一遍重复地去写的,比如一些UI或交互相似组件,或是一些相似的流程或逻辑.以前,面对这样的情况,我会将可以复用的部分抽象出来,做成可以复用的模块,放在专门存放公用模块的文件夹中,便于查找和引用.但是这样只能解决单个项目中公用模块复用的问题,如果你的模块需要被多个项目复用,那么就需要另寻它法了.本文讨论的是通过发布npm包来实现模块复用时有哪些注意事项. 新建一个

NPM 包管理工具详解,使用教程

NPM 包管理工具 1.1 定义:什么是 NPM NPM 全称 Node Package Manager,它是 JavaScript 的包管理工具, 并且是 Node.js 平台的默认包管理工具.通过NPM 可以安装.共享.分发代码,管理项目依赖关系. 可从NPM服务器下载别人编写的第三方包到本地使用. 可从NPM服务器下载并安装别人编写的命令行程序到本地使用. 可将自己编写的包或命令行程序上传到NPM服务器供别人使用. 其实我们可以把 NPM 理解为前端的 Maven.我们通过 npm 可以很

npm包管理工具

# 从官方包仓库中查找forever包的信息 npm search forever # 查看forever包中package.json的信息 npm view forever # 下载,安装forever npm install forever # 全局安装forever npm install -g forever # 查看node.js全局安装路径 npm root -g # 修改node.js的全局包安装路径 npm config set prefix "d:\node" # 查

Maven - 实例-2-使用本地仓库中的依赖包

Maven引入构建包的流程 执行mvn compile命令编译源代码,如果编译过程中需要用到其他的包, maven将会在pom.xml文件中查找是否引入该依赖包的坐标. 示例: <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </depen

Maven——向Maven本地仓库中手动添加依赖包(ps:ojdbc.jar)

maven中央仓库中并非包含所有现有的依赖包和插件,部分依赖包和插件需要手动地进行添加(如ojdbc.jar) 一.添加JDK系统环境变量(maven是基于Java的,可参考:https://www.runoob.com/w3cnote/windows10-java-setup.html) 二.添加mvn命令到路径(同1理进行配置) 三.进入cmd,输入mvn命令:mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc -

使用cnpm搭建私有NPM仓库 发布npm包

关于如何使用cnpm搭建私有的npm仓库看这里→ http://blog.fens.me/nodejs-cnpm-npm/ 我本人还没有机会真正实践操作过,公司的npm仓库是我老大搭建的,我这里仅仅记录关于如何发布npm包以及在这过程中出现的问题以及解决的方案. 因为官方的npm上的模块是完全开源,但是公司自己项目有些模块与业务或者逻辑以及一些配置模块肯定不能开源啊,所以需要搭建私有的npm仓库. 1.准备工作 首先安装好npm 以及 cnpm . 现在安装node.js 里会一起安装好npm.

在Maven仓库中添加Oracle数据库的JDBC驱动依赖

今天在使用IDEA构建Maven项目时,发现Oracle数据库JDBC驱动依赖使用不了,就在网上搜索了一下,下面是不能使用的原因. 由于Oracle授权问题,Maven3不提供oracle JDBC driver,我们也可以在Maven的中心搜索ojdbc驱动包,但是可以看到版本过于陈旧,即使有坐标,也下载不了. 为了可以在使用Maven构建的项目中使用Oracle JDBC driver,我们就必须手动添加Oracle的JDBC驱动依赖到本地仓库中. 既然要手动添加Maven依赖到本地仓库中,

将jar包添加到本地maven仓库中

在使用maven依赖添加jar包时,有时会遇到下载不成功的问题,这时需要将jar手动添加到本地的maven仓库中. 准备工作 配置好maven的环境变量 已经下载好的jar包 具体过程 win + R,输入cmd,进入命令窗口 输入命令:mvn install:install-file -Dfile="D:\BrowserDownload\httpclient-4.5.7.jar" -DgroupId=org.apache.httpcomponents -DartifactId=htt

maven项目中依赖自定jar包

在开发中经常会出现maven项目需要依赖一个自定义jar包,但是这个jar包并没有在maven仓库中,就会出现打包时找不到jar包的问题,解决办法如下: 在这个模块中,lib下的jar包是我自己定义的,maven仓库中并没有,在pom文件中添加jar包时,做以下处理 这样打包时就能找到包的位置了 原文地址:https://www.cnblogs.com/Zs-book1/p/12299806.html