数组基本操作
1. 查找数组元素
first--返回第一个元素
_.first(array);
head--返回第一个元素
_.head(array);
tail--返回除第一个元素之外的数组
_.tail([1, 2, 3]); //[2, 3]
last-返回最后元素
_.last(array);
findIndex--从头查询元素序号
遍历,查询到符合的元素即返回序号,没有符合的返回-1。predicate为Function|Object|String。
_.findIndex(array, [predicate]);
var users = [
{user: 'barney', active: false},
{user: 'fred', active: false},
{user: 'pebbles', active: true}
];
_.findIndex(users, function(o){return !o.user == 'barney';}); //0
_.findIndex(users, {user: 'fred', active: false}); //1
_.findIndex(users, ['active', false]); //0
_.findIndex(users, 'active'); //2
findLastIndex--从尾查询元素序号
用法类似 _.findIndex(),不过返回的序号为符合要求的最后一个。
indexOf--从头查询元素序号
从数组中查询value的序号,参数3如果是number,则从数组的number位置开始查找,参数3如果是true,则执行二分查找(二分查找为升序或降序的有序列表,查找时从中匹配为=或>或<,则可直接查找成功或只查找折半的子表)。
_.indexOf(array, value, number|bool);
_.indexOf([1, 2, 1, 2], 2); //1
_.indexOf([1, 2, 1, 2], 2, 2); //3
_.indexOf([1, 1, 2, 2], 2, true); //2
lastIndexOf--从尾查询元素序号
功能和_.indexOf()类似,不过从末尾开始查询。
2. 替换数组元素
fill--替换元素
从start到end,用value修改或填补数组元素。此方法直接改变数组,而不是返回新的数组。
_.fill(array, value, [start=0], [end=array.length];
var array = [1, 2, 3];
_.fill(array, 'a'); //['a', 'a', 'a']
_.fill(Array(3), b); //['b', 'b', 'b']
_.fill([4, 6, 8], '*', 1, 2); //[4, '*', 8]
3. 删除数组元素
initial--删除末尾元素
_.initial([1, 2, 3]); //[1, 2]
reset--删除首元素
和_.initial()相反。
drop--从头删除元素
从头开始删除number个数组元素。number不传默认为1
_.drop(array, [number]);
_.drop([1, 2, 3]); //[2, 3]
_.drop([1, 2, 3], 2); //[3]
dropRight--从尾删除元素
用法和drop一样,不过从尾部开始删除元素
dropRightWhile--从尾多功能过滤元素
从尾部开始通过参数对数组进行过滤,返回符合条件的调用。predicate可以为 Function|Object|String 。
_.dropRightWhile(array, [predicate]);
var users = [
{user: 'barney', active: true},
{user: 'fred', active: false},
{user: 'pebbles', active: false}
];
_.dropRightWhile(users, function(o){return !o.active;}); //['barney']
_.dropRightWhile(users, {user: 'pebbles', active: false}); //['barney', 'fre']
_.dropRightWhile(users, ['active', false]); //['barney']
_.dropRightWhile(users, 'active'); //['barney', 'fred', 'pebbles']
dropWhile--从头多功能过滤元素
功能和_.dropRightWhile()一样,只不过从头开始过滤。
compact--去除假值
去除数组中boolean值为false的元素,返回新的数组
_.compact(array);
_.compact(['a', 'b', '']); //['a', 'b']
_.compact([0, 1, false, 2, '', 3, NaN, undefined] //[1, 2, 3]
difference--删除特定元素
在数组array中去除和数组values中元素相同的元素。
_.difference(array, [values]);
_.difference([1, 2, 4], [2]); //[1, 4]
differenceBy--多功能删除特定元素
通过参数Function|Object|String来进行参数匹配,删除相应元素。
_.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--多功能删除特定元素
通过指定比较方式删除所匹配的数组元素。
var array = [{x: 1, y: 2}, {x: 2, y: 1}];
_.differenceWith(array, [{x: 1, y: 2}], _.isEqual); //[{x: 2, y: 1}]
pull--删除特定元素
直接对原数组操作,不返回新数组。
_.pull(arrary, [values]);
var arrary = [1, 2, 3, 1, 2, 3];
_.pull(array, 2, 3); //[1, 1]
pullAll--删除特定元素
和pull功能一样,不过pullAll参数为数组。
var array = [1, 2, 3, 1, 2, 3];
_.pullAll(array, [2, 3]); //[1, 1]
pullAllBy--多功能删除特定元素
匹配参数Function|Object|String删除对应的元素。
var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
_.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); //[{ 'x': 2 }]
pullAllWith--多功能删除特定元素
删除匹配指定匹配方式的元素。
var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
_.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); //[{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
pullAt--删除特定序号元素
直接对原数组操作,并且返回移除的元素组成的数组。
_.pullAt(array, [indexes]);
var array = [5, 10, 15, 20];
var delArr = _.pullAt(array, 1, 3);
//array: [5, 15]
//delArr: [10, 20]
remove--多功能删除元素
逻辑和_.dropRightWhile()类似,通过Function|Object|String进行删除元素匹配。对原数组进行操作,并返回移除的元素组成的数组。
_.remove(array, [predicate]);
``bash var array = [1, 2, 3, 4]; var delArr = _.remove(array, function(item){ return item % 2 == 0; }); //array: [1, 3] //delArr: [2, 4]
### without--删除数组某些值
不同于_.difference(),values为一些零散的参数。
```bash
_.without([1, 2, 1, 3], 1, 2); //[3]
xor--删除重复值后合并
可多组数组进行,两两配对删除,然后合并。
_.xor([2, 4], [1, 2]); //[4, 1]
_.xor([1, 2], [3, 4, 1]); //[2, 3, 4]
_.xor([1, 2], [1, 2], [1]); //[1]
_.xor([1, 2], [1, 2], [1, 4], [1, 4]); //[]
xorBy--多功能删除重复值后合并
_.xorBy([2.1, 1.2], [4.3, 2.4], Math.floor); // [1.2, 4.3]
_.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); // [{ 'x': 2 }]
xorWith--多功能删除重复值后合并
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--数组去重
如isSorted设置为true,表明数组为升降序排列数组,使用二分法去重。最后一个参数thisArg为指定this指向。
_.uniq([2, 1, 2]); //[2, 1]
uniqBy--数组多功能去重
可添加数据处理后对比去重。第二个参数可为 Function|Object|String。
_.uniqBy([2.1, 1.2, 2.3], Math.floor); //[2.1, 1.2]
_.uniqBy([1, 2.5, 1.5, 2], function(item){ //指定this为Math
return Math.floor(item);
});
//下列方式官方文档没有给出说明,经由我多次测试发现
//第二个参数设置为x时,对比数组中每个key为x的值,相同者去重
//若第二个参数在数组中没有响应的key,则永远返回数组第一项array[0]。
_.uniqBy([{'x': 1}, {'x': 2}, {'x': 1}], 'x'); //[{x: 1}, {x: 2}]
_.uniqBy([{'x': 1}, {'x': 2}, {'x': 1}], 'y'); //[{'x': 1}]
uniqWith--数组多功能去重
var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; .uniqWith(objects, .isEqual); // [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
### sortedUniq--有序数组去重
和_.uniq()功能类似,不过只对有序数组去重。
```bash
_.sortedUniq([1, 1, 2]); //[1, 2]
sortedUniqBy--有序数组多功能去重
和_.uniqBy()功能类似,不过只对有序数组去重。
_.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); //[1.1, 2.3]
3. 添加数组元素
sortedIndex--对有序数组进行插入
把元素按有序排列的方式在相应位置插入一个有序数组,返回插入的位置。
_.sortedIndex(array, value);
_.sortedIndex([30, 50], 40); //1
sortedLastIndex--对有序数组进行反向插入
与_.sortedIndex()功能类似,不过是从尾部开始插入。
_.sortedLastIndex([4, 4, 5, 5], 5); //4
4. 拆分数组
chunk--对数组分块
根据number对array进行均等分块
_.chunk(array, number);
_.chunk([1, 2, 3, 4], -1); //number <= 1时,按1等分
//[1, 2, 3, 4]
_.chunk[1, 2 , 3, 4], 3);
//[[1, 2, 3], [4]]
5. 合并数组
concat--合并数组或添加元素
添加任何元素至数组中,不改变原数组,返回一个新数组。
_.concat(array, [values]);
var array = [1];
var other = _.concat(array, 2, [3], [[4]]);
//array [1]
//other [1, 2, 3, [4]];
flatten--抹平嵌套数组
isDeep为空或者false时,只抹平第一层嵌套。为true时,全部抹平。
_.flatten([1, [2, 3, [4]]]); //[1, 2, 3, [4]]
_.flatten([1, [2, 3, [4]]], true); //[1, 2, 3, 4]
flattenDeep--全部抹平嵌套数组
_.flattenDeep([1, [2, 3, [4]]]); //[1, 2, 3, 4]
flattenDepth--抹平嵌套数组n次
默认depth为1.
_.flattenDepth(array, [depth=1]);
_.flattenDepth([1, [2, [3, [4]], 5]], 2); //[1, 2, 3, [4], 5]
join--合并数组为字符串
默认合并字符为 , 。
_.join(array, [separator=',']);
_.join(['a', 'b', 'c'], '~'); //'a~b~c'
6. 数组排序
reverse--反转数组
对原数组进行操作,不返回新数组。
var array = [1, 2, 3];
_.reverse(array); //array:[3, 2, 1]
7. 获取子数组
slice--截取数组
和原生slice功能类似。
_.slice(array, [start=0], [end=array.length]);
take--正向获取n个元素
获取数组中的前n个元素。默认为1
_.take(array, [n=1]);
_.take([1, 2, 3]); //[1]
_.take([1, 2, 3], 2); //[1, 2]
takeRight--反向获取n个元素
获取数组中的后n个元素。默认为1
_.takeRight([1, 2, 3], 2); //[2, 3]
takeRightWhile--反向多功能获取n个元素
通过Function|Object|String来确定所获取的元素。
_.takeRightWhile(array, predicate);
_.takeRightWhile([1, 2, 3], function(item){
return item > 1;
});
//[2, 3]
var users = [
{user: 'barney', active: true},
{user: 'fred', active: false},
{user: 'pebbles', active: false}
];
_.takeRightWhile(users, function(o){return !o.active}); //['fred', 'pebbles']
_.takeRightWhile(users, {user: 'pebbles', active: false}); //['pebles']
_.takeRightWhile(users, 'active'); //[]
takeWhile--正向多重获取n个元素
类似_.takeRightWhile(),执行顺序相反。
8. 其他数组操作
intersection--返回数组交集
_.intersection([1, 2], [2, 3], [4, 2]); //[2]
intersectionBy--多功能返回数组交集
返回第一个数组的元素。
_.intersectionBy([2.1, 1.2], [4.3, 2.4], Math.floor); //[2.1]
_.intersectionBy([{x: 1}], [{x: 2}, {x: 1}], 'x'); //[{x: 1}]
intersectionWith--多功能返回数组交集
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 }]
union--数组去重合并
_.union([arrays]);
_.union([1,2], [4, 2], [2, 1]); //[1, 2, 4]
unionBy--数组多功能去重合并
_.unionBy([2.1, 1.2], [4.3, 2.4], Math.floor); //[2.1, 1.2, 4.3]
_.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); //[{ 'x': 1 }, { 'x': 2 }]
unionWith--数组多功能去重合并
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 }]
zip--多数组同位置元素组合
把每个数组相同index位置的元素组合为一个数组。
_.zip(['a', 'b'], [30, 40], [true, false]); //[['a', 30, true], ['b', 40, false]]
_.zip(['a', 'b'], [30], [true, false]); //[['a', 30, true], ['b', undefined, false]]
unzip--还原zip后的数组
把zip的过程逆行。
_.zip(['a', 30, true], ['b', 40, false]); //[['a', 'b'], [30, 40], [true, false]]
unzipWith--在upzip时对数据进行操作
var zipped = _.zip([1, 2], [10, 20], [100, 200]); //[[1, 10, 100], [2, 20, 200]]
_.unzipWith(zipped, _.add); //[3, 30, 300]
zipWith
类似_.unzipWith()函数
zipObject--两数组配对转为json格式
两个数组间进行配对转换json。
_.zipObject(array, array);
_.zipObject(['zhou', 'chen'], [30, 33]); //{zhou: 30, chen: 33}
fromPairs--数组内元素转为json格式
_.fromPairs([['zhou', 30], ['chen', 33]]); //{zhou: 30, chen: 33}