上次面试js的string的方法居然没想起来。
怒刷几道小题。
题目描述
找出元素 item 在给定数组 arr 中的位置 输出描述: 如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1
输入例子: indexOf([ 1, 2, 3, 4 ], 3)
输出例子: 2
function indexOf(arr, item) { return arr.indexOf(item) }题目描述
计算给定数组 arr 中所有元素的总和 输入描述: 数组中的元素均为 Number 类型
输入例子: sum([ 1, 2, 3, 4 ])
输出例子: 10
function sum(arr) { var su = 0; arr.forEach(function(value,index,arr){ su += value; }) return su; }题目描述
移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr,结果返回新的数组 输入例子: remove([1, 2, 3, 4, 2], 2)
输出例子: [1, 3, 4]
function remove(arr, item) { return arr.filter(function(d){ return d !== item ; }) }使用filter数组元素过滤。
这样会产生一个新的数组
题目描述
移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回 输入例子: removeWithoutCopy([1, 2, 2, 3, 4, 2, 2], 2)
输出例子: [1, 3, 4]
function removeWithoutCopy(arr, item) { for(var i = 0; i < arr.length ; i++){ if(arr[i] === item){ arr.splice(i,1); i--; } } return arr; }使用了arr.splice 在原数组上直接删除
注意:如果在原数组上删除,i要动态改变。
题目描述
在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组 输入例子: append([1, 2, 3, 4], 10)
输出例子: [1, 2, 3, 4, 10]
function append(arr, item) { return [].concat(arr,item); }concat :返回新的数组
题目描述
删除数组 arr 最后一个元素。不要直接修改数组 arr,结果返回新的数组 输入例子: truncate([1, 2, 3, 4])
输出例子: [1, 2, 3]
function truncate(arr) { return arr.slice(0,arr.length-1); }slice。用于提取部分arr,返回新的数组。前闭后开。
题目描述
在数组 arr 开头添加元素 item。不要直接修改数组 arr,结果返回新的数组 输入例子: prepend([1, 2, 3, 4], 10)
输出例子: [10, 1, 2, 3, 4]
function prepend(arr, item) { return [].concat(item,arr); }题目描述
删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组 输入例子: curtail([1, 2, 3, 4])
输出例子: [2, 3, 4]
function curtail(arr) { return arr.slice(1,arr.length); }题目描述
合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组 输入例子: concat([1, 2, 3, 4], [‘a’, ‘b’, ‘c’, 1])
输出例子: [1, 2, 3, 4, ‘a’, ‘b’, ‘c’, 1]
function concat(arr1, arr2) { return [].concat(arr1,arr2); }题目描述
在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr,结果返回新的数组 输入例子: insert([1, 2, 3, 4], ‘z’, 2)
输出例子: [1, 2, ‘z’, 3, 4]
function insert(arr, item, index) { var arr1 = arr.slice(0) arr1.splice(index,0,item); return arr1; }slice 实现arr复制到arr1
题目描述
统计数组 arr 中值等于 item 的元素出现的次数 输入例子: count([1, 2, 4, 4, 3, 4, 3], 4)
输出例子: 3
function count(arr, item) { var count = 0; arr.forEach(function(value,index,arr){ if(value === item)count++; }) return count; }题目描述
找出数组 arr 中重复出现过的元素 输入例子: duplicates([1, 2, 4, 4, 3, 3, 1, 5, 3]).sort()
输出例子: [1, 3, 4]
function duplicates(arr) { var arr2 = []; var obj = {}; for(var i = 0,len = arr.length; i < len;i++){ if(!obj[arr[i]]){ obj[arr[i]] = 1; }else{ obj[arr[i]]++; if(obj[arr[i]] == 2){arr2.push(arr[i]);} } } return arr2; }题目描述
为数组 arr 中的每个元素求二次方。不要直接修改数组 arr,结果返回新的数组 输入例子: square([1, 2, 3, 4])
输出例子: [1, 4, 9, 16]
function square(arr) { return arr.map(function(data,index,arr){ return data*data; }) }题目描述
在数组 arr 中,查找值与 item 相等的元素出现的所有位置 输入例子: findAllOccurrences(‘abcdefabc’.split(”), ‘a’).sort()
输出例子: [0, 6]
function findAllOccurrences(arr, target) { var arr2 = []; arr.forEach(function(data,index,arr){ if(data === target){ arr2.push(index); } }) return arr2; }题目描述
实现一个打点计时器,要求 1、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1 2、返回的对象中需要包含一个 cancel 方法,用于停止定时操作 3、第一个数需要立即输出
function count(start, end) { console.log(start); var timer = setInterval(function(){ if(start < end){ console.log(++start); } },100); function cancel(){ clearInterval(timer); } return { cancel:cancel } }原来setinterval是每隔多少毫秒执行一次,并且不是立即执行的。
settimeout也不是立即执行的。
将数组 arr 中的元素作为调用函数 fn 的参数 输入例子:
argsAsArray(function (greeting, name, punctuation) {return greeting + ‘, ’ + name + (punctuation || ‘!’);}, [‘Hello’, ‘Ellie’, ‘!’])
输出例子:
Hello, Ellie!
function argsAsArray(fn, arr) { return fn.apply(this,arr); }题目描述
实现函数 makeClosures,调用之后满足如下条件: 1、返回一个函数数组 result,长度与 arr 相同 2、运行 result 中第 i 个函数,即 resulti,结果与 fn(arr[i]) 相同 输入例子: var arr = [1, 2, 3]; var square = function (x) { return x * x; }; var funcs = makeClosures(arr, square); funcs1;
输出例子: 4
function makeClosures(arr, fn) { var result = []; for(var i = 0;i < arr.length ; i++){ result.push(function(i){ return function(){ return fn(arr[i]); } }(i)); } return result; }闭包如何才能保持变量呢?
外部函数,构造成一个立即执行函数表达式,立即执行一下。 内部函数,获取到外部的传入参数。return出来。