小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
Array方法
chunk() 把数组拆分成一个二维数组,拆分后的第1个数组的长度为第二个参数的值
console.log(_.chunk(['a', 'b', 'c', 'd'], 2)); //[["a", "b"],["c", "d"]]
difference() 在第一个数组中把第二个数组里的数据都排除掉
console.log(_.difference([1, 3, 5, 7, 9], [3, 7])); // [1, 5, 9]
drop() 切掉数组的前n(第二个参数,默认为1)位
console.log(_.drop(['a', 'b', 'c', 'd', 'e'], 2)); //['c', 'd', 'e']
//dropRight() 切割数组,切掉数组的后n位
take() 提取数组的前n(第二个参数,默认为1)位。与drop方法相反
console.log(_.take(['a', 'b', 'c', 'd', 'e'], 2));
flattenDeep() 把数组递归为一维数组。相当于[].flat(Infinity)
console.log(_.flattenDeep(['a', ['b', ['c', ['d']]]])); //["a", "b", "c", "d"]
union() 取数组的并集(合并起来,去掉重复的)
console.log(_.union([2], [1, 2])); //[2, 1]
zip() 把各数组中索引值相同的数据放到一起,组成新数组
console.log(_.zip(['小明', '小红', '小刚'], ['男', '女', '男'], [12, 13, 14]));
//[["小明", "男", 12],["小红", "女", 13],["小刚", "男", 14]]
zipObject() 与上面方法一样,区别是它输出的是对象
console.log(_.zipObject(['小明', '小红', '小刚'], ['男', '女', '男'], [12, 13, 14]));
//{小明: "男", 小红: "女", 小刚: "男"}
Collection方法
countBy() 按照一定规则统计数量,key循环次数,value为匹配到的数量
console.log(_.countBy(['one', 'two', 'three'], 'length'));
//{3: 2, 5: 1} 按每个字符串的length进行统计,length为3的有两个数据。length为5的有1个数据
groupBy() 按照一定规则进行分组,key为循环次数,value为匹配到的数组
console.log(_.groupBy(['one', 'two', 'three'], 'length'));
//{3: ["one", "two"], 5: ["three"]}
orderBy() 排序,既能升序又能降序
var users = [
{ 'user': 'fred', 'age': 48 },
{ 'user': 'barney', 'age': 34 },
{ 'user': 'fred', 'age': 40 },
{ 'user': 'barney', 'age': 36 }
];
console.log(
_.orderBy(users, 'age', 'asc'), //以age属性的值进行升序排序
_.orderBy(users, 'user', 'desc'), //以user属性的值进行降序排序
);
sample() 从数组中随机取一个数据
console.log(_.sample(['a', 'b', 'c', 'd', 'e']));
sampleSize() 获得 n 个随机数据
console.log(_.sampleSize(['a', 'b', 'c', 'd', 'e'], 3));
function方法
defer() 推迟调用函数,在第二次事件循环的时候调用
_.defer(function (text) {
console.log(text);
}, '第二次事件循环');
console.log('第一次事件循环');
flip() 调用函数时翻转参数
function fn1() {
console.log(arguments);
}
fn1 = _.flip(fn1);
fn1(1, 2, 3);
negate() 结果取反函数
function fn2(n) {
return n % 2 == 0;
};
console.log(_.filter([1, 2, 3, 4, 5, 6], _.negate(fn2))); //[1, 3, 5]
once() 函数只能调用一次
function fn3(){
console.log('fn3');
}
var newFn3=_.once(fn3);
newFn3();
newFn3();
Lang方法
castArray() 强制转为数组,其实就是在外面加一层方括号
console.log(
_.castArray('a'), //["a"]
_.castArray({ a: 1, b: 2 }), //[{a: 1, b: 2}]
);
clone() 浅拷贝
var obj1 = {
a: 1,
b: {
c: 2
}
};
var obj2 = _.clone(obj1);
console.log(obj1, obj2);
obj2.b.c = 3, console.log(obj1, obj2);
cloneDeep() 深拷贝
var obj3 = _.cloneDeep(obj1);
obj3.b.c = 4, console.log(obj1, obj3);
conformsTo() 通过第二个参数来检测对象的属性值是否满足条件
var object = { 'a': 1, 'b': 2 };
console.log(
_.conformsTo(object, { 'b': function (n) { return n > 1 } }), //true
_.conformsTo(object, { 'b': function (n) { return n > 2 } }), //false
);
Object方法
at() 根据传入的属性创建一个数组
var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
console.log(_.at(object, ['a[0].b.c', 'a[1]'])); //[3, 4]
defaults() 合并对象,与assign()一样,不过assign方法合并时遇到相同的属性,后面的会覆盖前面的。defaults刚好相反,前面的覆盖后面的
console.log(
_.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }), //{a: 1, b: 2}
_.assign({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }), //{a: 3, b: 2}
);
invert() 把对象的key与value颠倒,后面的属性会覆盖前面的属性
var object = { 'a': 1, 'b': 2, 'c': 1 };
console.log(_.invert(object)); //{1: "c", 2: "b"}
omit() 删除对象里的属性
console.log(_.omit({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c'])); //{b: "2"}
pick() 筛选对象里的属性
console.log(_.pick({ 'a': 1, 'b': '2', 'c': 3 }, ['a', 'c'])); //{a: 1, c: 3}
String方法
camelCase() 转换字符串为驼峰格式
console.log(
_.camelCase('kaivon_chen'),
_.camelCase('kaivon chen'),
);
kebabCase() 转换字符为加-的形式
console.log(_.kebabCase('k a i')); //k-a-i
words() 把字符串的单词拆分成数组
console.log(_.words('kaivon chen')); //["kaivon", "chen"]