1.编写一个函数,这个函数接收一个整数数组 arr
和一个映射函数 fn
,通过该映射函数返回一个新的数组。
返回数组的创建语句应为 returnedArray[i] = fn(arr[i], i)
。
请你在不使用内置方法 Array.map
的前提下解决这个问题。
我的做法:(对比下和别人的差距)
var map = function(arr, fn) {
let arr1 = []
for (i = 0; i <arr.length ; i++)
arr1.push(fn(arr[i],i))
return arr1
};
整理下评论看到的做法:
var map = function(arr, fn) {
return Array.from(arr, fn);
};
其中,Array.from()的语法如下:
Array.from(arrayLike)
Array.from(arrayLike, mapFn)
Array.from(arrayLike, mapFn, thisArg)
var map = function(arr, fn) {
var temp = [];
arr.forEach((item, index) => temp[index] = fn(item, index));
return temp;
};
var map = function(arr, fn) {
return arr.reduce((p, c, i) => (p.push(fn.apply(null, [c, i])),p) , [])
};
var map = function(arr, fn) {
return arr.reduce((pre,cur,index)=>{
pre.push(fn(cur,index))
return pre
},[])
};
2.前两个是别人的做法
给定一个函数 fn
,它返回一个新的函数,返回的函数与原始函数完全相同,只不过它确保 fn
最多被调用一次。
- 第一次调用返回的函数时,它应该返回与
fn
相同的结果。 - 第一次后的每次调用,它应该返回
undefined
var once = function(fn) {
let result;
return function(...args){
if(fn){
result = fn.apply(this,[...args])
fn=null
}else{
result = undefined
}
return result
}
};
var once = function(fn) {
return function(...args){
try{
return fn(...args)
}
finally{
fn=()=>{}
}
}
};
var once = function(fn) {
let flag = 1;
return function(...args){
// 第一次fn会被调用,而之后都不会且返回undefined
// 思路(仿照):设置一个计数器,若为1则返回fn(...args),否则返回undefined
if (flag === 1) {
flag++
return fn(...args)
}
else
return undefined
}