一、合并对象
1、分配合并
_.assign()
合并对象,与Object.assign()方法一样。
返回:第一个参数(obj对象)
14 | console.log(_.assign(obj, new Foo, new Bar)); |
In 多了一个In
_.assignIn()
与上面一样,不过它能继承原型身上的属性
14 | console.log(_.assignIn(obj, new Foo, new Bar)); |
_.extend() -> assignIn 两个方法一样,一个人的两个名
_.assignInWith()
与上面一样,接收一个比较器做为参数,比较器是一个函数
1 | function customizer(objValue, srcValue) { |
2 | return _.isUndefined(objValue) ? srcValue : objValue; |
5 | var defaults = _.partialRight(_.assignInWith, customizer); |
7 | console.log(defaults({ 'a' :1 }, { 'b' : 2 }, { 'a' : 3 })); |
assignInWith方法经过partialRight处理后,参数类似于bind方法的作用
1). 先传比较器,并返回到defaults上
2). 运行defaults,再传要合并的对象
比较器参数_.isUndefined作用,判断属性值是undefined返回true。如果对象属性是undefine用来源的的对象的属性值覆盖
1 | console.log(defaults({ 'a' :undefined }, { 'b' : 2 }, { 'a' : 3 })); |
_.extendWith () -> assignInWith
_.assignWith() 也是接收一个比较器的函数做为参数
2、默认合并
_.defaults()
合并对象与assign()一样,不过assign方法合并时遇到相同的属性,后面的会覆盖前面的。defaults刚好相反,前面的覆盖后面的
1 | var targetObj = { 'a' : 1 }; |
3 | console.log(_.defaults(targetObj, { 'b' : 2 }, { 'a' : 3 })); |
defaults方法与assign方法的区别
2 | _.defaults({ 'a' : 1 }, { 'b' : 2 }, { 'a' : 3 }), |
3 | _.assign({ 'a' : 1 }, { 'b' : 2 }, { 'a' : 3 }), |
_.defaultsDeep()
defaultsDeep与defaults一致,不过它会深递归
1 | var target = { 'a' : { 'b' : 2 } }; |
2 | var sources = { 'a' : { 'b' : 1, 'c' : 3 } }; |
4 | console.log(_.defaultsDeep(target, sources)); |
对比defaults方法
1 | var target = { 'a' : { 'b' : 2 } }; |
2 | var sources = { 'a' : { 'b' : 1, 'c' : 3 } }; |
4 | console.log(_.defaults(target, sources)); |
3、融入并入
_.merge()
与assign一样,不过它遇到相同的属性名后并不会覆盖,merge会合并
返回object原对象
2 | 'a' : [{ 'b' : 2 }, { 'd' : 4 }] |
6 | 'a' : [{ 'c' : 3 }, { 'e' : 5 }] |
9 | console.log(_.merge(object, other)); |
1). a是一个数组,数组里有两条数据
2). 纵方向上合并,第一列跟第一列一组,第二列跟第二列一组
_mergeWith()
与上面的方法一致,不过多了接收一个比较器的函数做为参数
01 | function customizer(objValue, srcValue) { |
02 | if (_.isArray(objValue)) { |
03 | return objValue.concat(srcValue); |
07 | var object = { 'a' : [1], 'b' : [2]}; |
08 | var other = { 'a' : [3], 'b' : [4]}; |
10 | console.log(_.mergeWith(object, other, customizer)); |
还是纵方向合并
增加数组的位数,纵方向上合并
01 | function customizer(objValue, srcValue) { |
02 | if (_.isArray(objValue)) { |
03 | return objValue.concat(srcValue); |
07 | var object = { 'a' : [1, 'a1' ], 'b' : [2]}; |
08 | var other = { 'a' : [3, 'a3' ], 'b' : [4]}; |
10 | console.log(_.mergeWith(object, other, customizer)); |
二、创建数组
1、用对象的属性值创建数组
_.at()
根据传入的属性创建一个数组
2 | 'a' : [{ 'b' :{ 'c' :3},}, 4], |
5 | console.log(_.at(object, [ 'a[0].b.c' , 'a[1]' ] )); |
2、遍历对象创建数组
_.toPairs()
把对象里可枚举的属性(不包括继承的)创建成一个数组,与Object.entities()的方法一样
8 | console.log(_.toPairs( new Foo)); |
_.entries() /toPairs() 把对象里可枚举的属性(不包括继承的)创建成一个数组,与Object.entities()的方法一样
_.toPairsIn()
与上面的一样,但它包括继承的属性
8 | console.log(_.toPairsIn( new Foo)); |
_.entriesIn()/toPairsIn()与上面的一样,但它包括继承的属性
3、把对象的key放到数组中
_.keys()
作用:把对象的key放到一个数组里,与原生Object.keys()方法一样
返回:数组
8 | console.log(_.keys( new Foo)); |
字符串获取的是index索引
1 | console.log(_.keys( 'hello' )); |
_.keysIn()
与keys一样,只不过包含继承到的属性
8 | console.log(_.keysIn( new Foo)); |
4、与key对应的把value放到一个数组中
_.values()
作用:把对象的value放到一个数组里,与Object.value()的方法一样
返回:数组
8 | console.log(_.values( new Foo)); |
字符串拆分为数组
1 | console.log(_.values( 'hello' )); |
_.valuesIn()
与上面一样,只不过它包含继承到的属性
三、创建对象
1、创建一个对象的原型
_.create()
与Object.create()一样(陈老师)
创建一个原型继承prototype对象(自己看手册的体会)
16 | Circle.prototype = _.create(Shape.prototype, { 'constructor' : Circle}); |
18 | console.log(Circle.prototype); |
20 | var circleBal = new Circle; |
22 | console.log(circleBal instanceof Circle); |
23 | console.log(circleBal instanceof Shape); |
2、修改key创建一个新对象
_.mapKeys()
map是遍历的意思,遍历对象的key,但是mapkeys方法能修改key
第一个参数是对象
第二个参数function跟forEach类似
修改对象的key,value不会变
1 | var obj = { 'a' : 1, 'b' : 2 }; |
3 | var result = _.mapKeys(obj, function (value, key){ |
4 | return key + 'Q' + value; |
4、修改对象values创建一个对象
_.mapValues()
与上个方法一样,只不过它修改的是value,key不会变
2 | 'fred' : { 'user' : 'fred' , 'age' : 40 }, |
3 | 'pebbles' : { 'user' : 'pebbles' , 'age' : 1 } |
7 | console.log(_.mapValues(users, function (o){ return o.age; })); |
9 | console.log(_.mapValues(users, 'age' )); |
四、查找
1、查找符合条件的key
_.findKey()
与前面讲的find方法一样(find是集合里的方法),只不过它返回的是key
返回找到了只返回一条key,找不到返回undefined
02 | 'barney' : { 'age' : 36, 'active' : true }, |
03 | 'fred' : { 'age' : 40, 'active' : false }, |
04 | 'pebbles' : { 'age' : 1, 'active' : true } |
07 | console.log(_.findKey(users, function (o){ return o.age < 40; })); |
09 | console.log(_.findKey(users, { 'age' : 1, 'active' : true })); |
11 | console.log(_.findKey(users, [ 'active' , false ])); |
13 | console.log(_.findKey(users, 'active' )); |
_.findLastKey() 与上面一样,只不过它从反方向开始遍历
2、删除一些属性,返回剩余属性
_.omit()
删除对象里的一些属性,剩下的部分返回一个新对象
1 | var object = { 'a' : 1, 'b' : '2' , 'c' : 3 }; |
4 | _.omit(object, [ 'a' , 'c' ]), |
omit是忽略的意思
1). ['a', 'b'] 意思删除属性a、属性c
2). 返回一个新对象,包含剩下的属性b
_.mitBy()
与上面一样,不过是可接收一个迭代器的函数做为参数。迭代器的作用把数字类型都忽略掉
1 | var object = { 'a' : 1, 'b' : '2' , 'c' : 3 }; |
3 | console.log(_.omitBy(object, _.isNumber)); |
3、筛选
_.pick()
筛选对象里的属性。与omit是相反的,返回一个新对象
1 | var object = { 'a' : 1, 'b' : '2' , 'c' : 3 }; |
3 | console.log(_.pick(object, [ 'a' , 'c' ])); |
_.pickBy()
与上面一样,不过是可接收一个迭代器的函数做为参数
1 | var object = { 'a' : 1, 'b' : '2' , 'c' : 3 }; |
3 | console.log(_.pickBy(object, _.isNumber)); |
五、遍历
_.forIn()
与原生的for...in循环一样,只不过它是一个函数,语法与forEach一样。它遍历的是自己的属性与继承的属性
08 | _.forIn( new Foo, function (value, key) { |
09 | console.log(key, value); |
_.forInRight() 与forIn一样,只不过是反方向遍历
_.forOwn() 与forIn()一样,只不过forOwn只能遍历到自己的属性
_.forOwnRight() 与forOwn一样,只不过是反方向遍历
六、获取/设置
1、get
_.get()
获取属性的值,与Object.defineProperty()属性描述对象上的get方法一致
01/
字符串描述属性路径
1 | var object = { 'a' : [{ 'b' : { 'c' : 3 } }] }; |
3 | console.log(_.get(object, 'a[0].b.c' )); |
01/
数组描述属性路径
1 | var object = { 'a' : [{ 'b' : { 'c' : 3 } }] }; |
3 | console.log(_.get(object, [ 'a' , '0' , 'b' , 'c' ])); |
如果路径解析错误值是undefined ,返回第三个参数
1 | var object = { 'a' : [{ 'b' : { 'c' : 3 } }] }; |
3 | console.log( _.get(object, 'a.b.c' , '路径错误' ) ); |
2、set
_.set()
设置属性的值,与Object.defineProperty()属性描述对象上的set方法一致
1 | var object = { 'a' : [{ 'b' : { 'c' : 3 } }] }; |
3 | _.set(object, 'a[0].b.c' , 4); |
7 | console.log(object.a[0].b.c); |
数组描述路径,改变了对象结构
01 | var object = { 'a' : [{ 'b' : { 'c' : 3 } }] }; |
03 | _.set(object, [ 'x' , '0' , 'y' , 'z' ], 5); |
18 | console.log(object.x[0].y.z); |
_.setWith()
与set的一样,只不过可以给一个参数决定返回的是对象还是数组
3 | console.log( _.setWith(object, '[0][1]' , 'a' , Object)); |
参数:
1). '[0][1]' 是key,字符串形式的数组,对象是两层嵌套
2). 'a' 是值
3). Object 表示返回的是对象
3、result
_.result()
获取对象属性
与get一样都是取对象属性的,只不过它遇到函数的属性时,会调用函数,并且把this指向对象本身
08 | console.log(_.result(obj, 'a' )); |
10 | console.log(_.result(obj, 'b' )); |
12 | console.log(_.get(obj, 'b' )); |
七、has
_.has()
检查属性是否为对象的直接属性,与Object.hasOwnProperty()方法返回true一样
1 | var object = { 'a' : { 'b' : 2 } }; |
6 | _.has(object, [ 'a' , 'b' ]), |
检测对象有没有这个属性,有返回true否则反回false
.hasIn()
检查属性是对象的直接属性还是继承属性,也与Object.hasOwnProperty()一样,true表示直接属性,false表示继承属性
01 | var object = _.create({ 'a' : _.create({ 'b' : 2 }) }); |
03 | console.log(object.__proto__); |
04 | console.log(object.__proto__.a.__proto__); |
08 | _.hasIn(object, 'a.b' ), |
09 | _.hasIn(object, [ 'a' , 'b' ]), |
18 | _.has(object, [ 'a' , 'b' ]), |
八、颠倒
_.invert()
把对象的key和value颠倒,颠倒后如果有重复的,后面的属性会覆盖前面的属性
1 | var object = { a: 1, b: 2, c: 1 }; |
3 | console.log(_.invert(object)); |
_.invertBy()
与上面一样,它遇到相同的值后不会覆盖,而是会把所有放在一个数组里。另外它多了一个遍历器方法
01 | var object = { 'a' : 1, 'b' : 2, 'c' : 1 }; |
04 | console.log(_.invert(object)); |
07 | console.log(_.invertBy(object)); |
10 | var result = _.invertBy(object, function (value) { |
11 | return 'group' + value; |
九、处理属性值
_.invoke()
调用方法去处理取到的属性值
1 | var object = { 'a' : [{ 'b' : { 'c' : [1, 2, 3, 4] } }] }; |
3 | console.log(_.invoke(object, 'a[0].b.c.slice' , 1, 3)); |
用slice方法去截取a[0].b.c的1-3位
1). 获取的属性c是数组
2). 调用原生的slice方法截取数组,后面跟着传(1, 3)第1位到第3位前面(不包含第3位)
2). 返回处理的结果(截取的部分)
十、删除属性
_.unset()
删除属性的
返回布尔值
路径是字符串形式
5 | _.unset(object, 'a[0].b.c' ), console.log(object); |
属性c干掉了,b是一个空对象了{}
路径是数组的形式
1 | var object = { 'a' : [{ 'b' : { 'c' : 7 } }] }; |
3 | console.log(_.unset(object, [ 'a' , '0' , 'b' , 'c' ])); |
十一、修改
_.update()
这个与set一样,不过它可以接收一个函数的参数
3 | _.update(object, 'a' , function (n){ |
把属性a的值放到形参n,进行一个逻辑处理,然后更新对象a属性
手册上的例子
1 | var object = { 'a' : [{ 'b' : { 'c' : 3 } }] }; |
3 | _.update(object, 'a[0].b.c' , function (n) { return n * n; }); |
4 | console.log(object.a[0].b.c); |
7 | _.update(object, 'x[0].y.z' , function (n) { return n ? n + 1 : 0; }); |
8 | console.log(object.x[0].y.z); |
_.updateWith()
与上面的一样,不过可以接收一个路径的参数,决定生成的属性放在哪里
3 | _.updateWith(object, '[a][b]' , function () { |
手册上的例子
3 | _.updateWith(object, '[0][1]' , _.constant( 'a' ), Object); |
没什么用
functions()/functionsIn()这两个没有说??????
tranform 没什么用