三、ES6中数组拓展

一、Array.of() 将参数中所有值作为元素形成数组:

console.log(Array.of(1, 2, 3, 4)); // [1, 2, 3, 4]

参数的值可以为不同的类型:
console.log(Array.of(1, '2', true)); // [1, '2', true]

【三、ES6中数组拓展】参数为空时返回空数组:
console.log(Array.of()); // []

注意:
let arr1 = new Array(10); //是一个长度为10的空数组 let arr2 = Array.of(10); //长度为1,第一个元素值为10的数组

二、Array.from() 参数为数组,返回与原数组一样的数组:
console.log(Array.from([1, 2])); // [1, 2]

参数含空位:
console.log(Array.from([1, , 3])); // [1, undefined, 3]

对数组元素进行处理,形成新的数组:
let arr = Array.from([1,2,3],n=>n*2); console.log(arr); //[2,4,6]

利用函数处理数组,形成新的数组(奇数+1,偶数不变的规则):
//方案一: let arr1 = [1,2,3,4,5,6]; let arr2 = Array.from(arr1,function(n){ if(n%2==1) return n+1; else return n; }); console.log(arr2); //方案二: function f(n) { if(n%2==1) return n+1; else return n; } let arr1 = [1,2,3,4,5,6]; let arr2 = Array.from(arr1,function(n){ return f(n); }); console.log(arr2);

三、类数组对象转换 将类似数组的对象转换成真正的数组:
let arr = Array.from({ 0: "jack", 1: "rose", 2: "jordan", length: 3 }); console.log(arr); // ["jack", "rose", "jordan"]

没有 length 属性,则返回空数组:
let arr = Array.from({ 0: "jack", 1: "rose", 2: "jordan", }); console.log(arr); // []

元素属性名不为数值且无法转换为数值,返回长度为length元素值为undefined的数组:
let arr = Array.from({ a: "jack", b: "rose", c: "jordan", length: 3 }); console.log(arr); // [undefined, undefined,undefined]

四、转换可迭代对象 转换map:
let map = new Map(); map.set('23', '乔丹'); map.set('33', '皮蓬'); map.set('99', '罗德曼'); console.log(Array.from(map)); //[['23','乔丹'],['33','皮蓬'],['99','罗德曼']]

转换set:
let set = new Set(); set.add("乔丹"); set.add("皮蓬"); set.add("罗德曼"); console.log(Array.from(set)); //["乔丹","皮蓬","罗德曼"]

转换字符串:
let str = "hello!"; console.log(Array.from(str)); //['h','e','l','l','o','!']

五、扩展运算符... 复制数组内容:
//方案一:复制数组内容 // let arr1 = [1,2,3,4]; // let arr2 = [...arr1]; // console.log(arr2); // console.log(arr1 === arr2); //false(arr1和arr2引用不同,只是值相同)//方案二:直接数组名赋值 // let arr1 = [1,2,3,4]; // let arr2 = arr1; // console.log(arr2); // console.log(arr1 === arr2); //true(arr1和arr2的引用相同)

合并数组:
let arr1 = [1,2,3,4]; let arr2 = [1,2,3,4]; let arr = [...arr1,...arr2]; console.log(arr);

作为函数参数(可以接受可变长度的参数):
function Add(...items) { let sum = 0; for(let item of items) { sum += item; } return sum; } let result1 = Add(1,2,3); let result2 = Add(1,3,5,7,9); console.log(result1); console.log(result2);

六、扩展方法 查找:
//查找find()和findIndex() //find():查找数组中符合条件的元素,若有多个符合条件的元素,则返回第一个元素。 // let arr = ["乔丹","皮蓬","罗德曼"]; // let r = arr.find(item=>item == "皮蓬"); // console.log(r); //皮蓬// let arr = ["乔丹","皮蓬","罗德曼"]; // let r = arr.find(item=>item == "姚明"); // console.log(r); //undefined// let arr = [1,2,3,4]; // console.log(arr.find(item => item > 2)); // 3//findIndex():查找数组中符合条件的元素索引,若有多个符合条件的元素,则返回第一个元素索引。 let arr = [10,20,30,40]; console.log(arr.findIndex(item => item > 10)); // 1

填充:
//fill():将一定范围索引的数组元素内容填充为单个指定的值。 // 参数1:用来填充的值 // 参数2:被填充的起始索引 // 参数3(可选):被填充的结束索引,默认为数组末尾 // let arr = [1,2,3,4]; // arr.fill(0,1,2); // console.log(arr); //copyWithin():将一定范围索引的数组元素修改为此数组另一指定范围索引的元素。 // 参数1:被修改的起始索引 // 参数2:被用来覆盖的数据的起始索引 // 参数3(可选):被用来覆盖的数据的结束索引,默认为数组末尾 // let arr = [1,2,3,4]; // arr.copyWithin(0,2,4); // console.log(arr); // [3, 4, 3, 4]// let arr = [1, 2, ,4]; // arr.copyWithin(0, 2, 4); // console.log(arr); // [, 4, , 4]//第一个参数为负数表示倒数 // let arr = [1,2,3,4]; // arr.copyWithin(-2,0); // console.log(arr); // [1, 2, 1, 2]

包含:
//includes():数组是否包含指定值。 // 参数1:包含的指定值 // let arr = [1,2,3]; // let r = arr.includes(1); // true // console.log(r); // 参数2:可选,搜索的起始索引,默认为0 let arr = [1,2,3]; let r = arr.includes(1, 1); // false console.log(r);

嵌套数组转一维数组:
console.log([1 ,[2, 3]].flat()); // [1, 2, 3]// 指定转换的嵌套层数 console.log([1, [2, [3, [4, 5]]]].flat(2)); // [1, 2, 3, [4, 5]]// 不管嵌套多少层 console.log([1, [2, [3, [4, 5]]]].flat(Infinity)); // [1, 2, 3, 4, 5]// 自动跳过空位 console.log([1, [2, , 3]].flat()); // [1, 2, 3]

    推荐阅读