面试题
1.
{a:1, b:2, c:3} 转成[{a:1}, {b:2}, {c:3}]
function objToArr(obj) { const arr = []; const Obj = {}; for (const key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { Obj[key] = obj[key]; } } arr.push(Obj); return arr;}
2 对象数组排序
var presonArr = [ { name:'freddy', age:24, score:97 }, { name:'nick', age:18, score:87 }, { name:'mike', age:26, score:80 }, { name:'james', age:34, score:90 }, { name:'curry', age:30, score:83 }];//年龄升序排序presonArr.sort(function(a,b){ return a.age - b.age; });console.log(presonArr);
3.
var arr1 =[{a:1}, {b:2}, 3]
var arr2 = [].concat(arr1); // arr2 = [...arr1];
arr1 === arr2; // ?
arr1[0] === arr2[0] // ?
arr1[2] === arr2[2] // ?
arr1[0].a = 666;
arr2[0].a = ?
arr1[2] = 888;
arr2[2] = ?
持续问深拷贝
function deepCopy(data: any, hash = new WeakMap()) { if (typeof data !== 'object' || data === null) { throw new TypeError('传入参数不是对象'); } // 判断传入的待拷贝对象的援用是否存在于hash中 if (hash.has(data)) { return hash.get(data); } const newData = {}; const dataKeys = Object.keys(data); dataKeys.forEach(value => { const currentDataValue = data[value]; // 根本数据类型的值和函数间接赋值拷贝 if (typeof currentDataValue !== 'object' || currentDataValue === null) { newData[value] = currentDataValue; } else if (Array.isArray(currentDataValue)) { // 实现数组的深拷贝 newData[value] = [...currentDataValue]; } else if (currentDataValue instanceof Set) { // 实现set数据的深拷贝 newData[value] = new Set([...currentDataValue]); } else if (currentDataValue instanceof Map) { // 实现map数据的深拷贝 newData[value] = new Map([...currentDataValue]); } else { // 将这个待拷贝对象的援用存于hash中 hash.set(data, data); // 一般对象则递归赋值 newData[value] = deepCopy(currentDataValue, hash); } }); return newData;}
4
// 写出一个数组开展函数, 如输出:[1,[2,[3,4,2],2],5,[6]], 则输入:[1,2,3,4,2,2,5,6] // 因为和深度无关,所以说最简略能够这样function flatten(arr){ var res = arr.join().split(','); res = res.map( ele => +ele) return res;} // 还有吗,递归,写一下function flatten(arr){ var array = []; arr.forEach(ele => { if(Array.isArray(ele)){ array.push(...flatten(ele)); } else { array.push(ele); } }) return array;}
5
// 1.实现Promise.all()
https://segmentfault.com/a/11...
6 reduce及reduce数组去重
5、Array.reduce() -- 不扭转原数组
reduce(function(pre,cur,index,array){}, initValue)
pre相当于一个容器,寄存每次执行的后果;每次return的值会作为下次的pre。
回调函数第一次执行时,previousValue
和 currentValue
能够是一个值,如果 initialValue 在调用 reduce 时被提供,那么第一个 previousValue 等于 initialValue ,并且currentValue 等于数组中的第一个值;如果initialValue 未被提供,那么previousValue 等于数组中的第一个值,currentValue等于数组中的第二个值。
var arr = [1,2,3,4];arr.reduce(function(previousValue, currentValue){ return previousValue * currentValue;}); // 24console.log(arr); // [1,2,3,4]
// 数组去重var arr = [1,2,3,2,3,4];var newarr = arr.reduce(function(acc, cur){ !acc.includes(cur) && acc.push(cur); return acc;},[]); console.log(newArr); // [1,2,3,4]