ThinkingLink 2019-10-23
map
: 遍历数组,返回回调函数返回值组成的新数组,不改变原数组forEach
:无法break,可以用try/catch中throw new Error来停止filter
:过滤some
:有一项返回true,则整体为trueevery
:有一项返回false,则整体为falsejoin
:通过指定连接符生成字符串push
/ pop
:末尾推入和弹出,改变原数组, 返回推入/弹出项unshift
/ shift
:头部推入和弹出,改变原数组,返回操作项sort(fn)
/ reverse
:排序与反转,改变原数组concat
:连接数组,不影响原数组, 浅拷贝slice(start, end)
:返回截断后的新数组,不改变原数组splice(start, number, value)
:返回删除元素组成的数组,value为插入项,改变原数组indexOf
/ lastIndexOf(value, fromIndex)
:查找数组项,返回对应的下标reduce
/ reduceRight(fn(prev, cur), defaultPrev)
:两两执行,prev 为上次化简函数的return值,cur为当前值(从第二项开始)instanceof
运算符是用来判断一个对象的原型链中是不是能找到类型的 prototype
var arr = []; arr instanceof Array; // true
constructor
属性返回对创建此对象的数组函数的引用,就是返回对象相对应的构造函数javascript var arr = []; arr.constructor == Array; // true
var a = new Array(123); var b = new Date(); console.log(Array.isArray(a)); // true console.log(Array.isArray(b)); // false
通常我们会用循环的方式来遍历数组。但是循环是 导致js 性能问题的原因之一。一般我们会采用下几种方式来进行数组的遍历
var array2 = [...new Set([1,2,3,3,3,4,5])]; console.log(array2); // Array(5) [ 1, 2, 3, 4, 5 ]
let arr = Array(100000).fill(0).map((item, index) => index + 1);
arr.sort((a, b) => (Math.random() > 0.5 ? -1 : 1)); console.log(arr);
function shuffle(array) { let arrayLength = array.length, randomIndex, //随机数 tempItem; //临时存储元素 for (let i = arrayLength - 1; i >= 0; i--) { randomIndex = Math.floor(Math.random() * (i + 1)); tempItem = array[randomIndex]; array[randomIndex] = array[i]; array[i] = tempItem; } return array; } console.log(shuffle(arr));
[1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5]
flat()方法按照一个可以指定的嵌套深度的参数来递归遍历数组,并将所有元素以及遍历到的子数组里面的元素合并返回一个新数组。
var arr = [true, function(){}, [{}, [2]]]; var newArr = arr.flat(2); console.log(newArr); // ?[true, ?, {…}, 2]
function flatten(arr) { var res = []; arr.map(item => { if(Array.isArray(item)) { res = res.concat(flatten(item)); } else { res.push(item); } }); return res; }
function flatten(arr) { while(arr.some(item=>Array.isArray(item))) { arr = [].concat(...arr); } return arr; }
使用数组的reduce方法,遍历数组中的每一个项,如果某一项是数组,则继续遍历,否则concat(连接数组);
举例:javascript function flatten(arr) { return arr.reduce((result, item)=> { return result.concat(Array.isArray(item) ? flatten(item) : item); }, []); } var arr = [false, function(){}, [{}, [2]]]; var arr2 = [1, [2,3],4,[5,[6,7]]]; var newArr = flatten(arr); var newArr2 = flatten(arr2); console.log(newArr); // [false, ?, {…}, 2] console.log(newArr2); // [1, 2, 3, 4, 5, 6, 7]
实现数组扁平化的方法有很多,但是最核心的一点就是,遍历数组,拿到数组的每一项,如果是数组,再继续遍历,直到每一项不再是数组则停止。然后将这些项放到一个新的数组,最后将这个数组返回。数组降维,或者多维转一维都和数组扁平化是一个道理。
参考链接:
http://blog.poetries.top/FE-Interview-Questions/review/#_23-%E6%95%B0%E7%BB%84-array
https://www.cnblogs.com/chris-oil/p/8743509.html
https://www.cnblogs.com/owenzh/p/11058708.html https://juejin.im/post/5d391d336fb9a07ebe750343https://juejin.im/post/59716f15f265da6c4c500fc7
https://juejin.im/post/5adc8e396fb9a07aa0479725 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat