lodash入门
简介
Lodash是一个著名的javascript原生库,不需要引入其他第三方依赖。是一个意在提高开发者效率,提高JS原生方法性能的JS库。简单的说就是,很多方法lodash已经帮你写好了,直接调用就行,不用自己费尽心思去写了,而且可以统一方法的一致性。Lodash使用了一个简单的 _ 符号,就像Jquery的 $ 一样,十分简洁。
类似的还有Underscore.js和Lazy.js
支持
chrome 43往上
Firefox 38往上
IE 6-11
MS Edge
Safari 5往上
(几乎涵盖现在市面上可以见到的大部分浏览器)
如何安装
浏览器
<script src="lodash.js"></script>
直接下载下来引入,或者使用cdn
NPM
$ npm i -g npm
$ npm i --save lodash
先全局安装,在单独安装到项目中
node.js
var _ = require('lodash');
为什么使用lodash
通过使用数组,数字,对象,字符串等方法,Lodash使JavaScript变得更简单。
常用lodash函数
(参考版本lodash v4.16.1)
1、N次循环
<script type="text/javascript">
console.log('------- javascript -------');
//js原生的循环方法
for(var i = 0; i < 5; i++){
console.log(i);
}
console.log('------- lodash -------');
//ladash的times方法
_.times(5,function(a){
console.log(a);
});
</script>
for
语句是执行循环的不二选择,但在上面代码的使用场景下,_.times()
的解决方式更加简洁和易于理解。
2、深层查找属性值
<script type="text/javascript">
var ownerArr = [{
"owner": "Colin",
"pets": [{"name": "dog1"}, {"name": "dog2"}]
}, {
"owner": "John",
"pets": [{"name": "dog3"}, {"name": "dog4"}]
}];
var jsMap = ownerArr.map(function (owner) {
return owner.pets[0].name;
});
console.log('------- jsMap -------');
console.log(jsMap);
var lodashMap = _.map(ownerArr, 'pets[0].name');
console.log('------- lodashMap -------');
console.log(lodashMap);
</script>
Lodash中的_.map
方法和JavaScript中原生的数组方法非常的像,但它还是有非常有用的升级。 你可以通过一个字符串而不是回调函数来浏览深度嵌套的对象属性。
3、深克隆对象
<script type="text/javascript">
var objA = {
"name": "戈德斯文"
};
var objB = _.cloneDeep(objA);
console.log(objA);
console.log(objB);
console.log(objA === objB);
</script>
深度克隆JavaScript对象是困难的,并且也没有什么简单的解决方案。你可以使用原生的解决方案:JSON.parse(JSON.stringify(objectToClone))
进行深度克隆。但是,这种方案仅在对象内部没有方法的时候才可行。
4、在指定范围内获取一个随机值
<script type="text/javascript">
function getRandomNumber(min, max){
return Math.floor(Math.random() * (max - min)) + min;
}
console.log(getRandomNumber(15, 20));
console.log(_.random(15, 20));
</script>
Lodash中的 _.random
方法要比上面的原生方法更强大与灵活。你可以只传入一个参数作为最大值, 你也可以指定返回的结果为浮点数_.random(15,20,true)
5、扩展对象
<script type="text/javascript">
Object.prototype.extend = function(obj) {
for (var i in obj) {
if (obj.hasOwnProperty(i)) { //判断被扩展的对象有没有某个属性,
this[i] = obj[i];
}
}
};
var objA = {"name": "戈德斯文", "car": "宝马"};
var objB = {"name": "柴硕", "loveEat": true};
objA.extend(objB);
console.log(objA);
console.log(_.assign(objA, objB));
</script>
_.assign
方法也可以接收多个参数对象进行扩展,都是往后面的对象上合并
6、从列表中随机的选择列表项
<script type="text/javascript">
var smartTeam = ["戈德斯文", "杨海月", "柴硕", "师贝贝"];
function randomSmarter(smartTeam){
var index = Math.floor(Math.random() * smartTeam.length);
return smartTeam[index];
}
console.log(randomSmarter(smartTeam));
// Lodash
console.log(_.sample(smartTeam));
console.log(_.sampleSize(smartTeam,2));
</script>
此外,你也可以指定随机返回元素的个数_.sampleSize(smartTeam,n)
,n为需要返回的元素个数
7、判断对象中是否含有某元素
<script type="text/javascript">
var smartPerson = {
'name': '戈德斯文',
'gender': 'male'
},
smartTeam = ["戈德斯文", "杨海月", "柴硕", "师贝贝"];
console.log(_.includes(smartPerson, '戈德斯文'));
console.log(_.includes(smartTeam, '杨海月'));
console.log(_.includes(smartTeam, '杨海月',2));
</script>
_.includes()
第一个参数是需要查询的对象,第二个参数是需要查询的元素,第三个参数是开始查询的下标
8、遍历循环
<script type="text/javascript">
_([1, 2]).forEach(function(value) {
console.log(value);
});
_.forEach([1, 3] , function(value, key) {
console.log(key,value);
});
</script>
这两种方法都会分别输出‘1’和‘2’,不仅是数组,对象也可以,数组的是后key
是元素的下标,当传入的是对象的时候,key
是属性,value
是值
9、遍历循环执行某个方法
_.map()
<script type="text/javascript">
function square(n) {
return n * n;
}
console.log(_.map([4, 8], square));
// => [16, 64]
console.log(_.map({ 'a': 4, 'b': 8 }, square));
// => [16, 64] (iteration order is not guaranteed)
var users = [
{ 'user': 'barney' },
{ 'user': 'fred' }
];
// The `_.property` iteratee shorthand.
console.log(_.map(users, 'user'));
// => ['barney', 'fred']
</script>
10、检验值是否为空
_.isEmpty()
<script type="text/javascript">
_.isEmpty(null);
// => true
_.isEmpty(true);
// => true
_.isEmpty(1);
// => true
_.isEmpty([1, 2, 3]);
// => false
_.isEmpty({ 'a': 1 });
// => false
</script>
11、查找属性
_.find()
、_.filter()
、_.reject()
<script type="text/javascript">
var users = [
{'user': 'barney', 'age': 36, 'active': true},
{'user': 'fred', 'age': 40, 'active': false},
{'user': 'pebbles', 'age': 1, 'active': true}
];
console.log(_.find(users, function (o) {
return o.age < 40;
}));
console.log(_.find(users, {'age': 1, 'active': true}));
console.log(_.filter(users, {'age': 1, 'active': true}));
console.log(_.find(users, ['active', false]));
console.log(_.filter(users, ['active', false]));
console.log(_.find(users, 'active'));
console.log(_.filter(users, 'active'));
</script>
_.find()
第一个返回真值的第一个元素。
_.filter()
返回真值的所有元素的数组。
_.reject()
是_.filter
的反向方法,不返回真值的(集合)元素
12、数组去重
_.uniq(array)
创建一个去重后的array数组副本。
参数
array (Array)
: 要检查的数组。
返回新的去重后的数组
<script type="text/javascript">
var arr1 = [2, 1, 2];
var arr2 = _.uniq(arr1);
function unique(arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if(newArr.indexOf(arr[i]) == -1){
newArr.push(arr[i]);
}
}
return newArr;
}
console.log(arr1);
console.log(arr2);
console.log(unique(arr1));
</script>
_.uniqBy(array,[iteratee=_.identity])
这个方法类似 _.uniq
,除了它接受一个 iteratee
(迭代函数),调用每一个数组(array)的每个元素以产生唯一性计算的标准。iteratee 调用时会传入一个参数:(value)。
<script type="text/javascript">
console.log(_.uniqBy([2.1, 1.2, 2.3], Math.floor));
// => [2.1, 1.2]
console.log(_.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'));
// => [{ 'x': 1 }, { 'x': 2 }]
</script>
Math.floor
只是向下取整,去重,并没有改变原有的数组,所以还是2.1和1.2,不是2和1。
13、模板插入
_.template([string=''], [options={}])
<div id="container"></div>
<script src="https://cdn.bootcss.com/lodash.js/4.17.4/lodash.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
$(function () {
var data = [{name: '戈德斯文'}, {name: '柴硕'}, {name: '杨海月'}];
var t = _.template($("#tpl").html());
$("#container").html(t(data));
});
</script>
<script type="text/template" id="tpl">
<% _.each(obj,function(e,i){ %>
<ul>
<li><%= e.name %><%= i %></li>
</ul>
<%})%>
</script>
注意,这个<script>
标签的type
是text/template
,类似于react的JSX的写法,就是js和html可以混写,用<% %>
括起来的就是js代码,可以执行,直接写的就是html的标签,并且有类似MVC框架的的数据绑定,在<%= %>
中可以调用到数据呈现(纯属个人见解,不知道理解的对不对)
作者:戈德斯文
链接:https://www.jianshu.com/p/d46abfa4ddc9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
lodash入门的更多相关文章
- Lodash入门介绍
原文额地址 http://www.w3cplus.com/javascript/lodash-intro.html 有多年开发经验的工程师,往往都会有自己的一套工具库,称为 utils.helper ...
- Webpack+React+ES6开发模式入门指南
React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React,组件化似乎不再步履蹒跚,有了Reac ...
- Webpack 入门指南 - 1.安装
Webpack 是目前流行的打包工具,如何安装它呢? 1. 安装 Node Js 首先,Webpack 是基于 NodeJs 的工具,你必须首先安装 NodeJs. NodeJs 仅仅只需要在你的系统 ...
- [转]Backbone.js简单入门范例
本文转自:http://dmyz.org/archives/598 11年刚开始用前端MVC框架时写过一篇文章,当时Knockout和Backbone都在用,但之后的项目全是在用Backbone,主要 ...
- Webpack+React+ES6入门指南[转]
React无疑是今年最火的前端框架,github上的star直逼30,000,基于React的React Native的star也直逼20,000.有了React,组件化似乎不再步履蹒跚,有了Reac ...
- 《Gulp 入门指南》 : 使用 gulp 压缩 JS
<Gulp 入门指南> : 使用 gulp 压缩 JS 请务必理解如下章节后阅读此章节: 安装 Node 和 gulp 访问论坛获取帮助 压缩 js 代码可降低 js 文件大小,提高页面打 ...
- lodash中_.set的用法
_.set(object, path, value) # Ⓢ Ⓣ Ⓝ 设置对象的路径上的属性值.如果路径不存在,则创建它. 参数 1.object (Object): 待扩大的对象. 2.path ( ...
- webpack1 新手入门教程
本文github仓库地址: https://github.com/Rynxiao/webpack-tutorial ,里面包括了本教程的所有代码. [如果你觉得这篇文章写得不错,麻烦给本仓库一颗星:- ...
- 前端MVC Vue2学习总结(六)——axios与跨域HTTP请求、Lodash工具库
一.axios Vue更新到2.0之后宣告不再对vue-resource更新,推荐使用axios,axios是一个用于客户端与服务器通信的组件,axios 是一个基于Promise 用于浏览器和 no ...
随机推荐
- python3如何不生成pyc文件
使用-B参数 即 python3 -B test.py 设置环境变量 export PYTHONDONTWRITEBYTECODE=1 在导入的地方增加 import sys sys.dont_wri ...
- Python 开发工具链全解
可能刚开始学习Python时,有人跟你说可以将源文件所在的文件夹添加到 PYTHONPATH环境变量中,然后可以从其他位置导入此代码.在大多数情况下,这个人常常忘记补充这是一个非常糟糕的主意.有些人在 ...
- Serlvet容器与Web应用
对启动顺序的错误认识 之前一直有个观点,应用运行在Servlet容器中,因为从Servlet容器与Web应用的使用方式来看,确实很有这种感觉. 我们每次都是启动Servlet容器,然后再启动我们的应用 ...
- 基于 HTML5 WebGL 的污水处理厂泵站自控系统
前言 一道残阳铺水中,半江瑟瑟半江红.随着城市建设的迅速发展,每年都有大量新建管网水管通水运行.城市中有大量的排水设备,形成相应的城市排水系统,排水系统由检查井.排水泵站.污水处理厂.雨水口.排放口等 ...
- Android 中 OkHttp 三步实现生命周期绑定
简介 OkHttps 是 OkHttp 增强版的超轻量封装包. 和 Retrofit 相比,它更加轻量(只有 59Kb),是 Retrofit (124Kb)的一半,而且更加的开箱即用,API 更加自 ...
- 终止过久没有返回的 Windows API 函数 ---- “CancelSynchronousIo”
Marks pending synchronous I/O operations that are issued by the specified thread as canceled. BOOL W ...
- VirtualBox 原始镜像转换成 vdi 镜像
VBoxManage convertdd [-static] <filename> <outputfile> 将raw硬盘转换成vdi虚拟硬盘
- [Inno Setup] 执行程序,返回值不为0时提示用户
procedure LoadPerfCounter(); var Ret : Integer; begin if Exec(ExpandConstant('{sys}') + '\lodctr.exe ...
- 设计数据库 ER 图太麻烦?不妨试试这两款工具,自动生成数据库 ER 图!!!
忙,真忙 点赞再看,养成习惯,微信搜索『程序通事』,关注就完事了! 点击查看更多精彩的文章 这两个星期真是巨忙,年前有个项目因为各种莫名原因,一直拖到这个月才开始真正测试.然后上周又接到新需求,马不停 ...
- asList和ArrayList不得不说的故事
目录 简介 创建ArrayList UnsupportedOperationException asList 转换 总结 asList和ArrayList不得不说的故事 简介 提到集合类,ArrayL ...