数组的常用方法

Array.isArray() 用于确定传递的值是否是一个 Array。

//例如:
Array.isArray([1,2,3,])
//返回true
Array.isArray({foo: 123});
//返回false
//假如不存在 Array.isArray(),则在其他代码之前运行下面的代码将创建该方法。
if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

Array.of() 返回一个由参数组成的数组

Array.of() 可以把一组参数转换为数组。这个方法用于替代在ES6之前常用的Array.prototype.slice.call(arguments)

//这个方法的主要目的,是弥补数组构造函数Array()的不足。因为参数个数的不同,会导致Array()的行为有差异
//可以将一组数值转换为数组
Array.of(1,2,3)//转换为[1,2,3]
//Array方法没有参数、一个参数、三个参数时,返回结果都不一样。只有当参数个数不少于 2 个时,Array()才会返回由参数组成的新数组。参数个数只有一个时,实际上是指定数组的长度。
Array() // []
Array(2) // [, , ]
Array(2, 10, 9) // [2, 10, 9]
//Array.of()方法基本上可以用来替代Array()或new Array(),并且不存在由于参数不同而导致的重载。它的行为非常统一。

Array.from() 将数组对象转换为数组 不改变原对象 返回新数组

第一个参数是一个类数组对象,即任何可迭代的结构,或者有一个 length 属性和可索引元素的结构。

// 字符串会被拆分为单字符数组 
console.log(Array.from("Matt")); // ["M", "a", "t", "t"]

// 可以使用from()将集合和映射转换为一个新数组
const s = new Set().add(1).add(2).add(3).add(4);
console.log(Array.from(s)); // [1, 2, 3, 4]

// Array.from()对现有数组执行浅复制
const a1 = [1, 2, 3, 4]; 
const a2 = Array.from(a1);
console.log(a1); // [1, 2, 3, 4]
a1 === a2; // false
a2.push(5);
a1.length;	//?

// arguments对象可以被轻松地转换为数组
function getArgsArray() { 
    return Array.from(arguments); 
}
console.log(getArgsArray(1, 2, 3, 4)); // [1, 2, 3, 4]

// from()也能转换带有必要属性的自定义对象
const arrayLikeObject = { 0: 1, 1: 2, 2: 3, 3: 4, length: 4 };
console.log(Array.from(arrayLikeObject)); // [1, 2, 3, 4]

//没有length的对象不行,因为会将0,1,2,3当做对象的key,而不当做是下标
const arrayLikeObject = { 0: 1, 1: 2, 2: 3, 3: 4 };
console.log(Array.from(arrayLikeObject)); // []

pop() 删除数组最后一个元素(改变原数组) 返回被删除的元素

let arr = [1,2,3,4,5,6]
let brr = arr.pop()
console.log(brr)
//打印结果[1,2,3,4,5]
//pop是将数组中的最后一个元素删除

shift() 删除数组的第一个元素 (改变原数组) 返回被删除的元素

let arr =[1,2,3,4,5,6]
let brr = arr .shift()
console.log(brr)
//打印结果[2,3,4,5,6]

push() 向末尾添加元素(改变原数组) 返回添加后的length

let arr = [1,2,3,4,5]
let drr=arr.push(6)
console.log(drr)//[1,2,3,4,5,6]

unshift() 向数组开头添加元素(改变原数组) 返回添加后数组的length

let numbers = [1, 2, 3, 4, 5];
let length = numbers.unshift(7, 8, 9);
console.log(length);    // 8
console.log(numbers);   // [7, 8, 9, 1, 2, 3, 4, 5]

reverse() 反转数组 改变原数组

// 书中的例子,只是作为反向排序讲解,不够全面
let values = [1, 2, 3, 4, 5]; 
values.reverse();
console.log(values); // [5,4,3,2,1]

let numbers = [5,1,2,6,3];
numbers.reverse();
console.log(numbers); // [3, 6, 2, 1, 5]

let chars = ['c','b','d','a','w'];
chars.reverse();
console.log(chars); // ["w", "a", "d", "b", "c"]

let objs = [{a:1}, {a:5}, {a:3}];
objs.reverse();
console.log(objs);	// [{a:3},{a:5},{a:1}]

splice() 添加/删除/替换 当前数组改变

  • 删除
    需要给 splice() 传2个参数:要删除的第一个元素的位置和要删除的元素数量。从原数组中删除任意多个元素,并返回一个数组,返回的数组包含删除的项。比如splice(0, 2) 会删除原数组前两个元素,并返回一个数组,数组中包含前两个已删除的项。
let colors = ["red", "green", "blue"]; 
let removed = colors.splice(0,1); // 删除第一项,并将第一项返回
console.log(colors);	// ["green", "blue"]
console.log(removed);	// ["red"]

let colors = ["red", "green", "blue"]; 
let removed = colors.splice(-3);
console.log(colors);	// []
console.log(removed);	// ["red", "green", "blue"]

let colors = ["red", "green", "blue"]; 
let removed = colors.splice(-3,2);
console.log(colors);	// ["blue"]
console.log(removed);	// ["red", "green"]
  • 插入

需要给 splice() 传3个参数:开始位置、0(要删除的元素数量)和要插入的元素,可以在数组中指定的位置插入元素。第三个参数之后还可以传第四个、第五个参数,乃至任意多个要插入的元素。比如,splice(2, 0, "red", "green") 会从数组位置2开始插入字符串 “red” 和 “green” 。

let colors = ["red", "green", "blue"]; 
let removed = colors.splice(1, 0, "yellow", "orange"); // 在位置1插入两个元素
console.log(colors);	// ["red", "yellow", "orange", "green", "blue"]
console.log(removed);	// []
  • 替换

splice() 在删除元素的同时可以在指定位置插入新元素,样要传入3个参数:开始位置、要删除元素的数量和要插入的任意多个元素。要插入的元素数量不一定跟删除的元素数量一致。比如,splice(2, 1, "red", "green") 会在位置2删除一个元素,然后从该位置开始向数组中插入 “red” 和 “green”。

let colors = ["red", "green", "blue"]; 
let removed = colors.splice(1, 1, "red", "purple"); // 插入两个值,删除一个元素
console.log(colors);	// ["red", "red", "purple", "blue"]
console.log(removed);	// ["green"]

sort() 数组排序 (改变原数组) 参数为规定排序的比较函数(非必填)

sort()方法可以接收一个比较函数,用于判断哪个值应该排在前面。比较函数接收两个参数,如果第一个参数应该排在第二个参数前面,就返回负值;如果两个参数相等,就返回0;如果第一个参数应该排在第二个参数后面,就返回正值。

let values = [0, 1, 5, 10, 15];
values.sort();	// 不传比较函数出来的结果是不正常的
console.log(values); // 0,1,10,15,5

let values = [15, 1, 10, 5, 0];
values.sort(function (value1, value2) {
    if (value1 < value2) {
        return -1;
    }
    else if (value1 > value2) {
        return 1;
    }
    return 0;
});
console.log(values); // 0,1,5,10,15

//使用箭头函数简写
let values = [15, 1, 10, 5, 0];
values.sort((a, b) => a < b ? -1 : a > b ? 1 : 0);
console.log(values); // 0,1,5,10,15

//最简单的方法
let values = [15, 1, 10, 5, 0];
values.sort((a, b) => a - b);
console.log(values); // 0,1,5,10,15

copyWithin(target,start(可选),end(可选)) 数组的指定位置复制[改变原数组、ES6]

  • target:从该位置开始替换数据;
  • start:从该位置开始读取数据,默认为0;
  • end:到该位置停止数据的读取,默认为数组的长度
    copyWithin()会按照指定范围浅复制数组中的部分内容,然后将它们插入到指定索引开始的位置。开始索引和结束索引则与fill()使用同样的计算方法。
let ints = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
// 从ints中复制索引0开始的内容,插入到索引5开始的位置
// 在源索引或目标索引到达数组边界时停止
ints.copyWithin(5); 
console.log(ints); // [0, 1, 2, 3, 4, 0, 1, 2, 3,4]

let ints = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
// 从ints中复制索引5开始的内容,插入到索引0开始的位置
ints.copyWithin(0, 5); 
console.log(ints); // [5, 6, 7, 8, 9, 5, 6, 7, 8, 9]

let ints = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
// 从ints中复制索引大于0并且小于3的内容
// 插入到索引4开始的位置
ints.copyWithin(4, 0, 3); 
console.log(ints); // [0, 1, 2, 3, 0, 1, 2, 7, 8, 9]

let ints = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
ints.copyWithin(2, 0, 6); 
console.log(ints); // [0, 1, 0, 1, 2, 3, 4, 5, 8, 9]

// 支持负索引值,与fill()相对于数组末尾计算正向索引的过程是一样的
let ints = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
ints.copyWithin(-4, -7, -3); 
console.log(ints); // [0, 1, 2, 3, 4, 5, 3, 4, 5, 6]

fill(value,start,end)数组的填充 [改变原数组、ES6]

  • value:填充的值;
  • start:开始填充的位置;
  • end:填充结束的位置。
    使用fill()方法可以向一个已有的数组中插入全部或部分相同的值。开始索引用于指定开始填充的位置,它是可选的。如果不提供结束索引,则一直填充到数组末尾。

数组的所有的方法,只要涉及到开始下标和结束下标,那么开始下标就是>=的关系,结束下标就是<的关系。如果结束下标没有,那么就一直到数组的末尾了。

const zeroes = [0, 0, 0, 0, 0]; // 用5填充整个数组
zeroes.fill(5);
console.log(zeroes); // [5, 5, 5, 5, 5]

// 用6填充索引大于等于3的元素
zeroes.fill(0); // 重置
zeroes.fill(6, 3); 
console.log(zeroes); // [0, 0, 0, 6, 6]

// 用7填充索引大于等于1且小于3的元素
zeroes.fill(0); // 重置
zeroes.fill(7, 1, 3);
console.log(zeroes); // [0, 7, 7, 0, 0];

// 用8填充索引大于等于1且小于4的元素
// (-4 + zeroes.length = 1)
// (-1 + zeroes.length = 4)
zeroes.fill(8, -4, -1); 
console.log(zeroes); // [0, 8, 8, 8, 0];

fill()静默忽略超出数组边界、零长度及方向相反的索引范围

const zeroes = [0, 0, 0, 0, 0]; 
zeroes.fill(1, -10, -6);	// 索引过低,忽略
console.log(zeroes); // [0, 0, 0, 0, 0] 
zeroes.fill(1, 10, 15);		// 索引过高,忽略
console.log(zeroes);	// [0, 0, 0, 0, 0] 
zeroes.fill(2, 4, 2);	// 索引反向,忽略
console.log(zeroes); // [0, 0, 0, 0, 0]
zeroes.fill(4, 3, 10);	// 索引部分可用,填充可用部分 
console.log(zeroes); 	// [0, 0, 0, 4, 4]

slice() 拷贝数组元素 [不改变原数组]

slice()用于创建一个包含原有数组中一个或多个元素的新数组。slice()方法可以接收一个或两个参数:返回元素的开始索引和结束索引。如果只有一个参数,则 slice()会返回该索引到数组末尾的所有元素。如果有两个参数,则slice() 返回从开始索引到结束索引对应的所有元素,其中不包含结束索引对应的元素。

let colors = ["red", "green", "blue", "yellow", "purple"]; 
let colors2 = colors.slice(1); 
let colors3 = colors.slice(1, 4);
console.log(colors2);	// ["green", "blue", "yellow", "purple"
console.log(colors3);	// ["green", "blue", "yellow"]
console.log(colors);	// ["red", "green", "blue", "yellow", "purple"]
  • slice()的(负值索引从数组末尾开始计算,也可以将负索引想象成数组长度加上它得到的一个正索引(如果长度减去负索引还是得到负数,索引则从0开始)。)跟fill()负值索引计算方式一样。
  • 静默忽略超出数组边界、零长度及方向相反的索引范围也跟[^fill()]方法的一样。

join()将数组转换为字符串[不改变原数组]

数组拼接成字符串方法,方法传入拼接关键字

[{ a: 1 }, { a: 2 }].join('$');	// ?

let persons = [{ age: 50 }$ { age: 12 }$ { age: 30 }];

concat() 连接合并多个数组,返回新数组。[不改变原数组]

concat()方法可以在现有数组全部元素基础上创建一个新数组。它首先会创建一个当前数组的副本,然后再把它的参数添加到副本末尾,最后返回这个新构建的数组。

let colors = ["red", "green", "blue"]; 
let colors2 = colors.concat("yellow", ["black", "brown"]); 
console.log(colors); // ["red", "green","blue"]
console.log(colors2); // ["red", "green", "blue", "yellow", "black", "brown"]

//不能添加第二层的数据
let colors = ["red", "green", "blue"]; 
let colors2 = colors.concat("yellow", ["black", "brown"],"aaa",["bbb",'ccc', ['a','b',['c']]]);
console.log(colors2);	//["red", "green", "blue", "yellow", "black", "brown", "aaa", "bbb", "ccc", Array(3)]

toString() 方法可把数组转换为字符串,并返回结果。[不改变原数组]

let arr = [1,2,3]
arr.toString()//返回值是'1,2,3'

indexOf() 查找数组中某元素的第一个索引值。[不改变原数组] 如果没有就返回-1

let arr = [1,2,3]
arr.indexOf(1)//返回值是0
arr.indexOf(4)//返回值是-1

lastIndexOf() 逆向查找指定元素在数组中的第一个位置。[不改变原数组]

let arr =[1,2,3,1,2,4,5,]
arr.lastIndexOf(1)//显示的是最后一个1的下标为3

includes() 查找数组是否包含某个元素。[不改变原数组,]

let arr =[1,2,3,1,2,4,5,]
arr.includes(1)//返回的是一个布尔值判断这个数组中是否包含括号里的元素,现在返回为true

flat( ):用于数组扁平,数组去除未定义。

flat( ):用于数组扁平,数组去除未定义。

let ary = [1, [2, [3, [4, 5]]], 6];
console.log(ary.flat(1));	// [1, 2, Array(2), 6]
console.log(ary.flat());	// [1, 2, Array(2), 6],不传参默认为1
console.log(ary.flat(2));	// [1, 2, 3, Array(2), 6]
console.log(ary.flat(3));	// [1, 2, 3, 4, 5, 6]
console.log(ary.flat(100));	// [1, 2, 3, 4, 5, 6],可以超过维度深度,超过则会扁平化所有维度
console.log(ary.flat(Infinity));	//无限大的层数,表示可以扁平化所有维度
console.log(ary);	// [1, Array(2), 6]

flatMap( ):对原数组的每个成员执行一个函数.

 List<Integer> list1 = new ArrayList<>();
        List<String> list2 = new ArrayList<>();
        List<String> list3 = new ArrayList<>();
        List<User> list4 = new ArrayList<>();
        List<User> list5 = new ArrayList<>();
        list1.add(1);
        list1.add(2);
        list1.add(3);
        list2.add("aa");
        list2.add("bb");
        list2.add("cc");
        list3.add("a");
        list3.add("b");
        list3.add("c");
        list4.add(new User(1,"小红a"));
        list4.add(new User(2,"小明a"));
        list5.add(new User(3,"小红B"));
        list5.add(new User(4,"小明B"));
        //1。将三个list合为一个
        final List<? extends Serializable> collect = Stream.of(list1, list2, list3).flatMap(s -> s.stream()).collect(Collectors.toList());
        System.out.println(collect.toString());
        //2.将两个List<Integer>合2为一
        List<String> list = Stream.of(list2, list3).flatMap(s -> s.stream()).collect(Collectors.toList());
        System.out.println(list.toString());
        //3.获取两个List<User>中得所有名字name集合
        List<String> collect1 = Stream.of(list4, list5).flatMap(s -> s.stream().map(User::getName)).collect(Collectors.toList());
        System.out.println(collect1.toString())

结果:

[1, 2, 3, aa, bb, cc, a, b, c]
[aa, bb, cc, a, b, c]
[小红a, 小明a, 小红B, 小明B]

第三种可能我们会用得比较多得场景,取出多个list里得某个元素,然后都放到一个大list里,最后返回这个新的并集list

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值