lodash用法系列(2),处理对象
Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能。
官网:https://lodash.com/
引用:<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"></script>
安装:npm install lodash
首先通过npm安装lodash:
npm i --save lodash
在js文件中引用lodash:
var _ = require('lodash');
本系列包括:
● lodash用法系列(1),数组集合操作
● lodash用法系列(2),处理对象
● lodash用法系列(3),使用函数
● lodash用法系列(4),使用Map/Reduce转换
● lodash用法系列(5),链式
● lodash用法系列(6),函数种种
■ 类型隐式转换
true == 1;//右边的1会根据左边的true进行隐式转换
true === 1; //不会隐式转换
■ 判断参数是否是对象
function hello(greeting, person){
if(_.isPlainObject(greeting)){
person = greeting;
greeting = 'hi';
}
return greeting + person.name;
}
hello('hello',{name:''});
hello({name:''});
■ 判断计算结果
在Javascript中:
1/0;//Infinity
1+ '';//NaN
lodash中提供了isFinite, isNumber, isNaN方法。
var operand1 = 2/0
operand2 = NaN,
results = []; _.forEach([operand1, operand2], function(op){
if(_.isFinite(op)){
results.push('结果无穷尽');
} else {
if(!_.isNumber(op) || _.isNaN(op)){
results.push('结果不是数字');
} else {
results.push('结果不正确');
}
}
}); console.log(results);
■ 判断对象是否是函数
var _ = require('lodash');
var o = {
a: function(){return 'hi'},
b: []
};
//hi
console.log(_.isFunction(o.a) && o.a());
//false
console.log(_.isFunction(o.b) && o.b());
■ 给对象添加字段,相同字段值重写
var o = {
name: '',
age:22
};
_.assign(o, {occupation:''});
如果新添加的字段已经存在,会把该字段的值重写掉。
■ 给对象添加字段,合并字段值
如果新添加对象的字段存在,是否可以不把该字段的值重写掉呢?
--lodash提供了merge方法,有更加细粒度的控制。
var o1 = {
states: {running: 'off'},
names: ['a','b']
};
var o2 = {
states: {off: 'on'},
names: ['c','d']
};
var result = _.merge(o1, o2, function(dest, src){
if(_.isArray(dest) && _.isArray(src)){
return dest.concat(src);
}
});
//{ states: { running: 'off', off: 'on' },names: [ 'a', 'b', 'c', 'd' ] }
console.log(result);
以上,o1和o2都有相同的字段,使用merge方法后会遍历o1与o2的所有字段,但可喜的是:如果o2和o1的字段相同,并没有进行简单的重写字段值,而是进行了合并。并且,还可以判断o1和o2的字段类型,如果是数组,就把两个数组concat。
■ 给对象添加字段,保持原来字段的值
var o = {
name: 'a'
};
_.defaults(o, {
name: 'b'
});
■ 根据对象的值寻找键,findKey方法接受匿名函数
var o = {
name: 'a',
age: 20
}
var result = _.findKey(o, function(value){
return value === 'a';
});
//name
console.log(result);
又比如。
var obj = {
a: ['x','y'],
b: ['m','n']
};
var search = 'x';
var result = _.findKey(obj, function(value){
if(_.isArray(value)){
return _.contains(value, search);
} else {
return value === search;
}
});
//a
console.log(result);
■ 根据对象的值寻找键,findkey方法接受对象
var obj = {
a: {
name: 'a',
age:20
},
b: {
description:''
}
};
var result = _.findKey(obj, {name: 'a'});
//a
console.log(result);
■ 查询对象
var o = {
1: {
first:'',
enabled:false
},
2: {
first: '',
enabled:true
}
};
var result = _.find(o, 'enabled');
var result = _.where(o, {first: ''});
■ 遍历对象的字段
var o = {
name: '',
age:20,
description:''
};
var result = [];
_.forOwn(o, function(value, key){
result.push(key + ': ' + value);
});
console.log(result);
可见,forOwn方法与forEach方法的不同之处在于匿名函数的第二个参数是键,不是索引。
■ 遍历对象的字段,对象有父对象
unction Person(){
this.full = function(){return this.first + ' ' + this.last;};
}
function Employee(first, last, occupation){
this.first = first;
this.last = last;
this.occupation = occupation;
}
Employee.prototype = new Person();
var employee = new Employee('darren','ji','programmer'),
resultOwn = [],
resultIn = [];
_.forOwn(employee, function(value, key){
resultOwn.push(key);
});
//[ 'first', 'last', 'occupation' ]
console.log(resultOwn);
_.forIn(employee, function(value, key){
resultIn.push(key);
});
//[ 'first', 'last', 'occupation', 'full' ]
console.log(resultIn);
可见,forIn会遍历包括父对象的字段,forOwn只遍历当前对象的字段。
■ 获取对象的所有字段
var o1 = {
occupation: '',
last:'',
first:''
};
var result1 = _.sortBy(_.keys(o1));
//[ 'first', 'last', 'occupation' ]
console.log(result1);
■ 获取对象的所有字段,然后据此获取字段值
var o2 = {
occupation: 'manager',
last: 'ji',
first: 'darren'
};
//[ 'darren', 'ji', 'manager' ]
console.log(_.at(o2, _.sortBy(_.keys(o2))));
■ 获取对象的所有字段值
var o = {};
_.values(o);
■ 当不确定对象某个字段是否是函数或其它时使用result方法
var o1 = {name: 'a'},
o2 = {name: function(){return 'b';}},
o3 = {};
console.log(_.result(o1,'name','darren'));//a
console.log(_.result(o2, 'name','darren'));//b
console.log(_.result(o3, 'name', 'darren'));//darren
■ 获取一个对象的所有方法名
function Person(first, last){
this.first = first;
this.last = last;
}
Person.prototype.name = function(){
return this.first + ' ' + this.last;
}
//[ 'name' ]
var result = _.functions(new Person('darren','ji'));
console.log(result);
■ 把对象的键值对转换成数组元素
function format(label, value){
return label + ': ' + value;
}
var o = {
first: 'darren',
last: 'ji',
age:33
},result = '';
var pairsResult = _.pairs(o);
//[ [ 'first', 'darren' ], [ 'last', 'ji' ], [ 'age', 33 ] ]
console.log(pairsResult);
_.forEach(pairsResult, function(item){
result += format.apply(null, item) + '\n';
});
//first: darren
//last: ji
//age: 33
console.log(result);
■ 选择对象中的某些字段
var o1 = {
name: 'a',
occupation:'b'
},
o2 = {
spcecialty: 'c',
employer: 'd'
};
//pick对象的字段
var o2pick = _.pick(o2, 'spcecialty');
//{ spcecialty: 'c' }
console.log(o2pick);
var result = _.assign(o1, o2pick);
//{ name: 'a', occupation: 'b', spcecialty: 'c' }
console.log(result);
■ 去除对象中的某些字段
_.omit(o2, 'employer');
去除字段值为bool,o, null的字段。
var o = {
name: 'a',
age:0,
occupation:null,
enabled: true
};
var r = _.omit(o, function(value){
return !(!_.isBoolean(value) && value);
});
//{ name: 'a' }
console.log(r);
■ 颠倒对象的键和值
unction sortValues(object){
return _.values(object).sort();
}
var o1 = {
first: 'a',
last: 'b'
},
o2 = {
first: 'c',
last: 'd'
};
//[ 'a', 'b' ]
console.log(sortValues(o1));
[ 'first', 'last' ]
console.log(sortValues(_.invert(o2)));
■ 创建对象
unction Person() {
}
Person.prototype.name = function () {
return this.first + ' ' + this.last;
}
var arr = [
{first: 'aa', last: 'bb'},
{first: 'cc', last: 'dd'},
{first: 'ee', last: 'ff'},
],
people = [];
_.forEach(arr, function(item){
people.push(_.create(Person.prototype, item));
});
//[ 'aa bb', 'cc dd', 'ee ff' ]
console.log(_.invoke(people, 'name'));
以上,可以吧Person看作是一个接口或抽象类,通过prototype属性动态添加name方法。通过create方法动态把实例和Person.prototype绑定上。最后,通过invoke方法触发数组内Person元素的name方法。
■ 拷贝对象
function Person(first, last){
this.first = first;
this.last = last;
}
var o1 = {
first: 'darren',
last: 'ji'
},
o2 = new Person('jack','chen'),
clone1 = _.clone(o1),
clone2 = _.clone(o2);
//darren
console.log(clone1.first);
//jack
console.log(clone2.first);
参考资料:lodash in essential
未完待续~~
lodash用法系列(2),处理对象的更多相关文章
- lodash用法系列(6),函数种种
Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...
- lodash用法系列(5),链式
Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...
- lodash用法系列(4),使用Map/Reduce转换
Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...
- lodash用法系列(3),使用函数
Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...
- lodash用法系列(1),数组集合操作
Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...
- ADO.NET系列之Command对象
ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 上一篇<ADO.NE ...
- javascript系列之变量对象
原文:javascript系列之变量对象 引言 一般在编程的时候,我们会定义函数和变量来成功的构造我们的系统.但是解析器该如何找到这些数据(函数,变量)呢?当我们引用需要的对象时,又发生了什么了? 很 ...
- ADO.NET系列之Connection对象
ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 ADO.NET概念 ADO ...
- ADO.NET系列之DataAdapter对象
ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 我们前两篇文章介绍了ADO ...
随机推荐
- mysqldump只导出表结构或只导出数据的实现方法【转】
mysql mysqldump 只导出表结构 不导出数据 mysqldump --opt -d 数据库名 -u root -p > xxx.sql 备份数据库 #mysqldump 数据库名 & ...
- C#中的GetElementsByClassName方法
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public static class Spread { ...
- android 通用 Intent
通用 Intent 本文内容显示详细信息 闹钟 日历 相机 联系人/人员应用 电子邮件 文件存储 本地操作 地图 音乐或视频 新笔记 电话 搜索 设置 发送短信 网络浏览器 使用 Android 调试 ...
- ubuntu16。04LST配置nfs实现服务器和客户端共享文件
NFS(network file system)网络文件系统可以实现不同主机与操作系统之间通过网络进行资源共享,此时一台PC充当服务器,若干台PC充当那客户端,具体如何配置请跟随我的步骤来做 1 下载 ...
- ntpdate时间同步
为什么需要网络同步时间: Linux服务器运行久时,系统时间就会存在一定的误差,一般情况下可以使用date命令进行时间设置,但在做数据库集群分片等操作时对多台机器的时间差是有要求的,此时就需要使用nt ...
- java 捕获所有异常
1.) 通过捕获异常类型的基类Exception就可以处理所有类型的异常.(事实上还有其它的基类,但Exception是同编程活动相关的基类) 2.)因为Exception是与编程有关的所有异常类的基 ...
- prometheus的平台侧和应用侧结合,实现应用的metrics的抓取
这个细节,迷惑了我一段时间,前面也写过一篇blog,描述过这个问题. 今天看到一种更好的解决方法. 记录一下. prometheus在k8s集群里,抓取应用的metrics. 是需要平台侧和应用侧相互 ...
- 【LOJ】#2523. 「HAOI2018」奇怪的背包
题解 复杂度怎么算也要2s的题怎么0.5s就跑完了,迷啊 这个题简直算完复杂度不敢写,写了就赚飞了好吧 根据裴蜀定理,显然选出的数和P的gcd是w的约数 我们考虑枚举\(P\)的约数,上限当然是\(\ ...
- Ubuntu 18.04 下配置 HAXM 加速 Android模拟器
Ubuntu 18.04 下配置 HAXM 加速 Android模拟器 最近在vmware环境下搭建ubuntu18.04开发环境,开始发现总是运行android模拟器在console提示加载如下错误 ...
- P2651 添加括号III
P2651 添加括号III无论怎么添加,a2一定是分母,其他的可以是分子,所以最后看看,(a1*a3*..*an)%a2==0即可 #include<iostream> #include& ...