获取指定元素
nth(指定下标)
// 获取数组中指定下标的元素
_.nth(array, [n=0]);
_.nth(['a', 'b', 'c', 'd'], 1);
// => 'b'
head/first(第一个元素)
// 获取数组的第一个元素
_.head(array);
_.first(array);
_.head([1, 2, 3]);
// => 1
// 获取数组的第一个元素
_.first([1, 2, 3]);
// => 1
last(最后一个元素)
// 获取数组的最后一个元素
_.last(array);
_.last([1, 2, 3]);
// => 3
find(迭代器,正向匹配)
// 正向遍历
// 返回迭代器第一个返回 true 的元素
_.find(collection, [predicate=_.identity], [fromIndex=0]);
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false },
{ 'user': 'pebbles', 'age': 1, 'active': true }
];
_.find(users, function(o) { return o.age < 40; });
// => object for 'barney'
// The `_.matches` iteratee shorthand.
_.find(users, { 'age': 1, 'active': true });
// => object for 'pebbles'
// The `_.matchesProperty` iteratee shorthand.
_.find(users, ['active', false]);
// => object for 'fred'
// The `_.property` iteratee shorthand.
_.find(users, 'active');
// => object for 'barney'
findLast(迭代器,反向匹配)
// 反向遍历
// 返回迭代器第一个返回 true 的元素
_.findLast(collection, [predicate=_.identity], [fromIndex=collection.length-1]);
_.findLast([1, 2, 3, 4], function(n) {
return n % 2 === 1;
});
// => 3
范围选择元素
slice(下标区域选择)
// 选取从 start 到 end 的元素
// 注意:不包括 end
_.slice(array, [start=0], [end=array.length])
_.slice([1, 2, 3, 4], 0, 3);
// => [1, 2, 3];
tail(第一个元素外的所有元素)
// 选取数组第一个元素之外
// 所有其他元素
_.tail(array);
_.tail([1, 2, 3]);
// => [2, 3]
initial(最后一个元素外的所有元素)
// 选择数组最后一个元素之外
// 所有其他元素
_.initial(array);
_.initial([1, 2, 3]);
// => [1, 2]
take(开头或结尾的 n 个元素)
// 选取数组开头的 n 个元素
_.take(array, [n=1]);
// 选取数组结尾的 n 个元素
_.takeRight(array, [n=1]);
// 通过迭代器
// 从开头选择元素
// 直到迭代器返回 false
_.takeWhile(array, [predicate=_.identity]);
// 通过迭代器
// 从结尾选择元素
// 直到迭代器返回 false
_.takeRightWhile(array, [predicate=_.identity]);
_.take([1, 2, 3], 2);
// => [1, 2]
_.takeRight([1, 2, 3], 2);
// => [2, 3]
_.takeWhile([1, 2, 3, 4, 5, 6], num => num < 4);
// => [1, 2, 3]
_.takeRightWhile([1, 2, 3, 4, 5, 6], num => num > 4);
// => [5, 6]
drop(头或尾元素之外的其余元素)
// 选取去掉开头的前 n 个元素之外的所有其他元素
_.drop(array, [n=1]);
// 返回去掉结尾的 n 个元素之外的所有其他元素
_.dropRight(array, [n=1]);
// 从开头到结尾循环删除,直到返回 false 为止,返回剩下的元素
_.dropWhile(array, [predicate=_.identity]);
// 从结尾到开头循环删除,直到返回 false 为止,返回剩下的元素
_.dropRightWhile(array, [predicate=_.identity]);
_.drop([1, 2, 3], 2);
// => [3]
_.dropRight([1, 2, 3], 2);
// => [1]
_.dropWhile([ 1, 2, 3 ], num => num < 3);
// => [3]
_.dropRightWhile([ 1, 2, 3 ], num => num > 1);
// => [1]
寻找元素下标
indexOf(全等匹配)
// 从前向后
// 全等比较
// 返回下标
// 没找到会返回 -1
_.indexOf(array, value, [fromIndex=0]);
// 从后向前
// 全等比较
// 返回下标
// 没找到会返回 -1
_.lastIndexOf(array, value, [fromIndex=array.length-1]);
_.indexOf([1, 2, 1, 2], 2, 2);
// => 3
_.lastIndexOf([1, 2, 1, 2], 2);
// => 3
findIndex(迭代器匹配)
// 从前向后
// 通过判断器判断是否相等
// 返回为 true 时的下标
_.findIndex(array, [predicate=_.identity], [fromIndex=0]);
// 从后向前
// 通过判断器判断是否相等
// 返回为 true 时的下标
_.findLastIndex(array, [predicate=_.identity], [fromIndex=array.length-1]);
_.findIndex([ 1, 2, 3, 4, 5 ], num => num === 5);
// => 4
_.findLastIndex([ 1, 2, 3, 4, 5 ], num => num === 5);
// => 4
sortedIndexOf(没理解啥意思)
// 没理解啥意思........
// 这个方法类似 _.indexOf,除了它是在已经排序的数组array上执行二进制检索。
_.sortedIndexOf(array, value);
// 没理解啥意思........
_.sortedLastIndexOf(array, value);
删除元素
without(传入指定元素,返回新数组)
_.without(array, [values]);
_.without([2, 1, 2, 3], 1, 2);
// => [3]
difference(传入数组, 返回新数组)
// 删除数组中指定的元素,全等比较
_.difference(array, [ values ]);
// 通过迭代器将元素进行转换后(返回值)再进行比较
// 返回元素转化前的新数组
_.differenceBy(array, [values], [iteratee=_.identity]);
// 根据判断器的返回值(true 或 false),判断是否相等
_.differenceWith(array, [values], [comparator]);
_.difference([ 3, 2, 1 ], [ 4, 2 ]);
// => [ 3, 1 ]
_.differenceBy([ 3.1, 2.2, 1.3 ], [ 4.4, 2.5 ], Math.floor);
// => [ 3.1, 1.3 ]
_.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
// => [{ 'x': 2 }]
_.differenceWith(
[{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }],
[{ 'x': 1, 'y': 2 }],
_.isEqual
);
// => [{ 'x': 2, 'y': 1 }]
pull(传入无限制,影响源数组)
// 指定元素
// 全等比较删除
// 返回源数组
_.pull(array, [values]);
// 指定元素数组
// 全等比较删除
// 返回源数组
_.pullAll(array, values);
// 将元素通过迭代器转换
// 将转换后的值进行比较
// 返回源数组(数组中元素为转换前的值)
_.pullAllBy(array, values, [iteratee=_.identity]);
// 根据判断器进行比较
// 根据返回值 true 或 false
// 判断两值是否相等
// 返回源数组
_.pullAllWith(array, values, [comparator]);
// 根据索引移出相应元素
// 返回删除的元素组成的数组
_.pullAt(array, [indexes]);
_.pull([1, 2, 3, 1, 2, 3], 2, 3);
// => [1, 1]
_.pullAll([1, 2, 3, 1, 2, 3], [2, 3]);
// => [1, 1]
_.pullAllBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }], [{ 'x': 1 }, { 'x': 3 }], 'x');
// => [{ 'x': 2 }]
_.pullAllWith(
[{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }],
[{ 'x': 3, 'y': 4 }],
_.isEqual
);
// => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
var array = [5, 10, 15, 20];
var evens = _.pullAt(array, 1, 3);
console.log(array);
// => [5, 15]
console.log(evens);
// => [10, 20]
remove(传入判断器,影响源数组)
_.remove(array, [predicate=_.identity]);
var array = [1, 2, 3, 4];
var evens = _.remove(array, function(n) {
return n % 2 === 0;
});
console.log(array);
// => [1, 3]
console.log(evens);
// => [2, 4]
判断
includes(全等判断,某元素是否存在)
// 如果指定 fromIndex 是负数,那么从 collection(集合) 的结尾开始检索
// 返回 true 或 false
_.includes(collection, value, [fromIndex=0]);
_.includes([1, 2, 3], 1);
// => true
_.includes([1, 2, 3], 1, 2);
// => false
_.includes({ 'user': 'fred', 'age': 40 }, 'fred');
// => true
_.includes('pebbles', 'eb');
// => true
some(判断器判断,某元素是否存在)
返回 true 或 false
// 若判断器返回了 true
// 会立刻停止遍历
// 返回结果
_.some(collection, [predicate=_.identity])
_.some([null, 0, 'yes', false], Boolean);
// => true
var users = [
{ 'user': 'barney', 'active': true },
{ 'user': 'fred', 'active': false }
];
// The `_.matches` iteratee shorthand.
_.some(users, { 'user': 'barney', 'active': false });
// => false
// The `_.matchesProperty` iteratee shorthand.
_.some(users, ['active', false]);
// => true
// The `_.property` iteratee shorthand.
_.some(users, 'active');
// => true
every(是否是全真集合)
// 通过迭代器判断数组中是否全都为真
// 返回 true 或 false
_.every(collection, [predicate=_.identity]);
_.every([true, 1, null, 'yes'], Boolean);
// => false
var users = [
{ 'user': 'barney', 'age': 36, 'active': false },
{ 'user': 'fred', 'age': 40, 'active': false }
];
// The `_.matches` iteratee shorthand.
_.every(users, { 'user': 'barney', 'active': false });
// => false
// The `_.matchesProperty` iteratee shorthand.
_.every(users, ['active', false]);
// => true
// The `_.property` iteratee shorthand.
_.every(users, 'active');
// => false
筛选
filter(真元素集合)
// 遍历数组
// 根据迭代器的返回值
// 筛选出为 true 的元素
// 返回新数组
_.filter(collection, [predicate=_.identity]);
var users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'fred', 'age': 40, 'active': false }
];
_.filter(users, function(o) { return !o.active; });
// => objects for ['fred']
// The `_.matches` iteratee shorthand.
_.filter(users, { 'age': 36, 'active': true });
// => objects for ['barney']
// The `_.matchesProperty` iteratee shorthand.
_.filter(users, ['active', false]);
// => objects for ['fred']
// The `_.property` iteratee shorthand.
_.filter(users, 'active');
// => objects for ['barney']
reject(假元素集合)
返回新数组
// 遍历数组
// 通过迭代器的返回值
// 筛选出为假值的集合
// 返回新数组
_.reject(collection, [predicate=_.identity])
var users = [
{ 'user': 'barney', 'age': 36, 'active': false },
{ 'user': 'fred', 'age': 40, 'active': true }
];
_.reject(users, function(o) { return !o.active; });
// => objects for ['fred']
// `_.matches` 迭代简写
_.reject(users, { 'age': 40, 'active': true });
// => objects for ['barney']
// `_.matchesProperty` 迭代简写
_.reject(users, ['active', false]);
// => objects for ['fred']
// `_.property` 迭代简写
_.reject(users, 'active');
// => objects for ['barney']
partition(真假元素集合)
返回新数组
// 将集合按照迭代器的返回值分为 ['真', '假'] 两个数组
// 返回新数组
_.partition(collection, [predicate=_.identity]);
var users = [
{ 'user': 'barney', 'age': 36, 'active': false },
{ 'user': 'fred', 'age': 40, 'active': true },
{ 'user': 'pebbles', 'age': 1, 'active': false }
];
_.partition(users, function(o) { return o.active; });
// => objects for [['fred'], ['barney', 'pebbles']]
// The `_.matches` iteratee shorthand.
_.partition(users, { 'age': 1, 'active': false });
// => objects for [['pebbles'], ['barney', 'fred']]
// The `_.matchesProperty` iteratee shorthand.
_.partition(users, ['active', false]);
// => objects for [['barney', 'pebbles'], ['fred']]
// The `_.property` iteratee shorthand.
_.partition(users, 'active');
// => objects for [['fred'], ['barney', 'pebbles']]
排序
sortBy(迭代器,升序排序)
返回新数组
PS:可以不传第二个参数,默认就和原生方法 sort 一样,升序排序。
_.sortBy(collection, [iteratees=[_.identity]])
var users = [
{ 'user': 'fred', 'age': 48 },
{ 'user': 'barney', 'age': 36 },
{ 'user': 'fred', 'age': 40 },
{ 'user': 'barney', 'age': 34 }
];
_.sortBy(users, function(o) { return o.user; });
// => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
_.sortBy(users, ['user', 'age']);
// => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]
_.sortBy(users, 'user', function(o) {
return Math.floor(o.age / 10);
});
// => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
orderBy(迭代器,多次排序)
返回新数组
// 通常用于对象集合排序
// 可指定多个属性排序(asc,desc)
// 返回新数组
_.orderBy(collection, [iteratees=[_.identity]], [orders]);
var users = [
{ 'user': 'fred', 'age': 48 },
{ 'user': 'barney', 'age': 34 },
{ 'user': 'fred', 'age': 40 },
{ 'user': 'barney', 'age': 36 }
];
// 以 `user` 升序排序 再 `age` 以降序排序。
_.orderBy(users, ['user', 'age'], ['asc', 'desc']);
// => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
合并
concat(拼接)
// 和 Array.prototype.concat 一样
_.concat(array, [values]);
_.concat([1], 2, [3], [[4]]);
// => [1, 2, 3, [4]]
union(合并,去重)
// 返回新数组
_.union([arrays]);
// 先将元素通过迭代器转换
// 合并,去重
// 返回新数组,元素为转换前
_.unionBy([arrays], [iteratee=_.identity]);
// 根据判断器判断两值是否相等
// 合并,去重
// 返回新数组
_.unionWith([arrays], [comparator]);
_.union([2], [1, 2]);
// => [2, 1]
_.unionBy([2.1], [1.2, 2.3], Math.floor);
// => [2.1, 1.2]
// 对象数组可简写
_.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
// => [{ 'x': 1 }, { 'x': 2 }]
var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
_.unionWith(objects, others, _.isEqual);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
intersection(筛选交集,去重)
// 筛选出传入的数组中都包含的元素
// 返回新数组
_.intersection([arrays]);
// 先将元素通过迭代器转换
// 再筛选出转换后的值的交集
// 返回新数组
_.intersectionBy([arrays], [iteratee=_.identity]);
// 通过判断器,判断两值是否相等
// 筛选交集
// 返回新数组
_.intersectionWith([arrays], [comparator]);
_.intersection([2, 1], [4, 2], [1, 2]);
// => [2]
_.intersectionBy([2.1, 1.2], [4.3, 2.4], Math.floor);
// => [2.1]
_.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
// => [{ 'x': 1 }]
var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
_.intersectionWith(objects, others, _.isEqual);
// => [{ 'x': 1, 'y': 2 }]
xor(筛选唯一,去重)
// 筛选出传入的多个数组中,唯一的元素
// 返回新数组
_.xor([arrays]);
// 先将元素通过迭代器转换
// 再筛选出多个数组中的唯一值
// 返回新数组,元素为转换前的
_.xorBy([arrays], [iteratee=_.identity]);
// 根据判断器,判断两值是否相等
// 筛选出多个数组中,唯一存在的值
// 返回新数组
_.xorWith([arrays], [comparator]);
_.xor([2, 1, 1, 1, 1], [2, 3]);
// => [1, 3]
_.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
// => [1.2, 3.4]
var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
_.xorWith(objects, others, _.isEqual);
// => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
去重
uniq
// 全等去重
_.uniq(array);
// 先将值通过迭代器转换
// 比较转换后的值去重
// 返回新数组
_.uniqBy(array, [iteratee=_.identity]);
// 通过判断器,判断两值是否相等
// 进行去重
// 返回新数组
_.uniqWith(array, [comparator]);
_.uniq([2, 1, 2]);
// => [2, 1]
_.uniqBy([2.1, 1.2, 2.3], Math.floor);
// => [2.1, 1.2]
_.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
// => [{ 'x': 1 }, { 'x': 2 }]
_.uniqWith(
[{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }],
_.isEqual
);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
去假值
compact(数组去假值)
// 去除数组中的假值
// false, null, 0, "", undefined, 和 NaN 都是被认为是假值
// 返回新数组
_.compact(array);
_.compact([0, 1, false, 2, '', 3]);
// => [1, 2, 3]
随机
sample(随机获取一个元素)
返回元素
_.sample(collection);
_.sample([1, 2, 3, 4]);
// => 2
sampleSize(随机获取 n 个元素)
返回新数组
_.sampleSize(collection, [n=1])
_.sampleSize([1, 2, 3], 2);
// => [3, 1]
_.sampleSize([1, 2, 3], 4);
// => [2, 3, 1]
shuffle(打乱数组)
返回新数组
_.shuffle(collection)
_.shuffle([1, 2, 3, 4]);
// => [4, 1, 3, 2]
求和
reduce(正向)
返回结果
// 遍历集合
// 通过迭代器累加值
// 最终返回结果
_.reduce(collection, [iteratee=_.identity], [accumulator])
_.reduce([1, 2], function(sum, n) {
return sum + n;
}, 0);
// => 3
_.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
(result[value] || (result[value] = [])).push(key);
return result;
}, {});
// => { '1': ['a', 'c'], '2': ['b'] } (无法保证遍历的顺序)
reduceRight(反向)
返回结果
// 同 reduce
// 不过遍历顺序是反向的
_.reduceRight(collection, [iteratee=_.identity], [accumulator])
var array = [[0, 1], [2, 3], [4, 5]];
_.reduceRight(array, function(flattened, other) {
return flattened.concat(other);
}, []);
// => [4, 5, 2, 3, 0, 1]
分组
groupBy(返回新对象)
// 按照迭代器的返回值进行分组
// 返回新对象
_.groupBy(collection, [iteratee=_.identity]);
_.groupBy([6.1, 4.2, 6.3], Math.floor);
// => { '4': [4.2], '6': [6.1, 6.3] }
// The `_.property` iteratee shorthand.
_.groupBy(['one', 'two', 'three'], 'length');
// => { '3': ['one', 'two'], '5': ['three'] }
chunk(数组分块)
// 按照 size 将数组分成若干小小组
// 返回新的二维数组
_.chunk(array, [size=1]);
_.chunk(['a', 'b', 'c', 'd'], 3);
// => [['a', 'b', 'c'], ['d']]
遍历
迭代函数中只要返回了 false 就会立刻停止循环
each(正向遍历)
_.each(collection, [iteratee=_.identity]);
_.forEach(collection, [iteratee=_.identity]);
_([1, 2]).each(function(value) {
console.log(value);
});
// => Logs `1` then `2`.
eachRight(反向遍历)
_.eachRight(collection, [iteratee=_.identity]);
_.forEachRight(collection, [iteratee=_.identity]);
_.forEachRight([1, 2], function(value) {
console.log(value);
});
// => Logs `2` then `1`.
遍历,返回结果
map
返回新数组
// 通过迭代器处理值
// 并返回结果,组成新数组
// 返回新数组
_.map(collection, [iteratee=_.identity]);
function square(n) {
return n * n;
}
_.map([4, 8], square);
// => [16, 64]
_.map({ 'a': 4, 'b': 8 }, square);
// => [16, 64] (iteration order is not guaranteed)
var users = [
{ 'user': 'barney' },
{ 'user': 'fred' }
];
// The `_.property` iteratee shorthand.
_.map(users, 'user');
// => ['barney', 'fred']
invokeMap(和 map 差不多)
返回新数组
_.invokeMap(collection, path, [args]);
_.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
// => [[1, 5, 7], [1, 2, 3]]
_.invokeMap([123, 456], String.prototype.split, '');
// => [['1', '2', '3'], ['4', '5', '6']]
填充数组
fill(用字符填充数组,改变源数组)
// 用指定字符串填充指定区域
// 注意 end 不包含
// 改变源数组
_.fill(array, value, [start=0], [end=array.length]);
_.fill([4, 6, 8, 10], '*', 1, 3);
// => [4, '*', '*', 10]
降维
flatten(数组降维)
// 降一级
// 返回新数组
_.flatten(array);
// 递归降维,将为一维数组
// 返回新数组
_.flattenDeep(array);
// 指定降多少级
// 返回新数组
_.flattenDepth(array, [depth=1]);
_.flatten([1, [2, [3, [4]], 5]]);
// => [1, 2, [3, [4]], 5]
_.flattenDeep([1, [2, [3, [4]], 5]]);
// => [1, 2, 3, 4, 5]
_.flattenDepth([1, [2, [3, [4]], 5]], 2);
// => [1, 2, 3, [4], 5]
数组转对象
keyBy(迭代器返回值为 key)
返回新对象
// 根据迭代器的返回值当做 key
// value 为返回 key 的最后一个元素
// 组成新对象
_.keyBy(collection, [iteratee=_.identity]);
var array = [
{ 'dir': 'left', 'code': 97 },
{ 'dir': 'right', 'code': 100 }
];
_.keyBy(array, function(o) {
return String.fromCharCode(o.code);
});
// => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
_.keyBy(array, 'dir');
// => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
fromPairs(二维数组转为对象)
// 二维数组转为对象
// 返回新对象
_.fromPairs(pairs);
_.fromPairs([['fred', 30], ['barney', 40]]);
// => { 'fred': 30, 'barney': 40 }
拼接字符串
join
// 同 Array.prototype.join
_.join(array, [separator=',']);
_.join(['a', 'b', 'c'], '~');
// => 'a~b~c'
翻转
reverse(数组翻转)
// 会改变源数组
_.reverse([1, 2, 3]);
// => [3, 2, 1]
插入位置计算
sortedIndex
// 计算 value 在 array 中
// 尽可能小的排序位置
// 返回下标
_.sortedIndex(array, value);
// 计算 value 在 array 中
// 尽可能大的排序位置
// 返回下标
_.sortedLastIndex(array, value);
// 根据迭代器的返回值计算尽可能小的位置
// 通常用于对象简写
// 返回位置
_.sortedIndexBy(array, value, [iteratee=_.identity]);
// 根据迭代器的返回值计算尽可能大的位置
// 通常用于对象简写
// 返回位置
_.sortedLastIndexBy(array, value, [iteratee=_.identity]);
_.sortedIndex([30, 50], 40);
// => 1
_.sortedLastIndex([4, 5, 5, 5, 6], 5);
// => 4
_.sortedIndexBy(
[{ 'x': 4 }, { 'x': 5 }],
{ 'x': 4 },
'x'
);
// => 0
_.sortedLastIndexBy(
[{ 'x': 4 }, { 'x': 5 }],
{ 'x': 4 },
'x'
);
// => 1
数组组合
zip
// 将传入的多个数组
// 按照下标组合
// 返回二维数组
_.zip([arrays]);
// 将传入的多个数组,按照迭代器进行组合
_.zipWith([arrays], [iteratee=_.identity]);
// 第一个参数为 key 数组,第二位数组为 value 数组,组合成一个对象
_.zipObject([props=[]], [values=[]]);
// 类似于 zipObject,可以指定 path
_.zipObjectDeep([props=[]], [values=[]]);
// _.zip 的方向版,将二位数组拆分成多个数组
_.unzip(zipped);
// 通过迭代器拆分
_.unzipWith(array, [iteratee=_.identity]);
_.zip(['fred', 'barney'], [30, 40], [true, false]);
// => [['fred', 30, true], ['barney', 40, false]]
_.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
return a + b + c;
});
// => [111, 222]
_.zipObject(['a', 'b'], [1, 2]);
// => { 'a': 1, 'b': 2 }
_.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
// => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
_.unzip(['fred', 'barney'], [30, 40], [true, false]);
// => [['fred', 'barney'], [30, 40], [true, false]]
_.unzipWith([[1, 10, 100], [2, 20, 200]], _.add);
// => [3, 30, 300]
统计次数
countBy(统计次数)
// 将迭代器的返回值作为 key,value 为 key 返回的次数
// 返回新对象
_.countBy(collection, [iteratee=_.identity]);
_.countBy([6.1, 4.2, 6.3], Math.floor);
// => { '4': 1, '6': 2 }
创建扁平化数组
flatMap
// 迭代器返回的值都会默认降维一级
// 返回新数组
_.flatMap(collection, [iteratee=_.identity]);
// 递归降维
// 返回新数组
_.flatMapDeep(collection, [iteratee=_.identity]);
// 指定降维级数
// 返回新数组
_.flatMapDepth(collection, [iteratee=_.identity], [depth=1]);
_.flatMap([1, 2], function (n) {
return [n, n];
});
// => [1, 1, 2, 2]
_.flatMapDeep([1, 2], function (n) {
return [[[n, n]]];
});
// => [1, 1, 2, 2]
_.flatMapDepth([1, 2], function (n) {
return [[[n, n]]];
}, 2);
// => [[1, 1], [2, 2]]
创建范围数组
range(正序,从 start 到 end 的数组)
返回新数组
_.range([start=0], end, [step=1]);
_.range(4);
// => [0, 1, 2, 3]
_.range(-4);
// => [0, -1, -2, -3]
_.range(1, 5);
// => [1, 2, 3, 4]
_.range(0, 20, 5);
// => [0, 5, 10, 15]
_.range(0, -4, -1);
// => [0, -1, -2, -3]
_.range(1, 4, 0);
// => [1, 1, 1]
_.range(0);
// => []
rangeRight(降序,从 end 到 start 的数组)
_.rangeRight([start=0], end, [step=1]);
_.rangeRight(4);
// => [3, 2, 1, 0]
_.rangeRight(-4);
// => [-3, -2, -1, 0]
_.rangeRight(1, 5);
// => [4, 3, 2, 1]
_.rangeRight(0, 20, 5);
// => [15, 10, 5, 0]
_.rangeRight(0, -4, -1);
// => [-3, -2, -1, 0]
_.rangeRight(1, 4, 0);
// => [1, 1, 1]
_.rangeRight(0);
// => []
长度
size
如果集合是类数组或字符串,返回其 length
如果集合是对象,返回其可枚举属性的个数。
_.size(collection);
_.size([1, 2, 3]);
// => 3
_.size({ 'a': 1, 'b': 2 });
// => 2
_.size('pebbles');
// => 7