JS能力测评经典题1-10

1. 查找数组元素的位置

找出元素 item 在给定数组 arr 中的位置

输出描述:

1
如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1

示例1

输入

1
[ 1, 2, 3, 4 ], 3

输出

1
2

break是跳出一层循环,continue是结束一趟循环 ,return结束所有层循环

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

function indexOf(arr, item) {
//1.判断浏览器是否支持indexOf方法
if (Array.prototype.indexOf){
return arr.indexOf(item);
} else {
for (var i = 0; i < arr.length; i++){
//2.用===进行判断
if (arr[i] === item){
return i;
}
}
}
return -1;
}

2. 数组求和

计算给定数组 arr 中所有元素的总和

输入描述:

1
数组中的元素均为 Number 类型

示例1

输入

1
[ 1, 2, 3, 4 ]

输出

1
10

普通常规

1
2
3
4
5
6
7
function sum(arr) {
var sum=0;
for(var i=0;i<arr.length;i++){
sum+=arr[i];
}
return sum;
}

迭代方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function sum(arr){
var sum=0;
arr.every(function(item,index,array){
sum+=item;
//every方法数组中每一项执行函数结果都为true才会返回true。
return true;
})
return sum;
}

function sum(arr){
var sum=0;
//some方法如果数组中有元素满足条件返回 true,否则返回 false。
arr.some(function(item,index,array){
sum+=item;
})
return sum;
}


function sum(arr){
var sum=0;
//filter()返回数组,包含了符合条件的所有元素。如果没有符合条件的元素则返回空数组。
arr.filter(function(item,index,array){
sum+=item;
})
return sum;
}
function sum(arr){
var sum=0;
//map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
arr.map(function(item,index,array){
sum+=item;
})
return sum;
}
function sum(arr){
var sum=0;
//forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。没有返回值
arr.forEach(function(item,index,array){
sum+=item;
})
return sum;
}

归并方法

1
2
3
4
5
function sum(arr){
return arr.reduce(function(prev,cur,index,array){
return prev+cur;
})
}

递归方法

1
2
3
4
5
6
7
8
9
10
function sum(arr) {
    var len = arr.length;
    if(len == 0){
        return 0;
    } else if (len == 1){
        return arr[0];
    } else {
        return arr[0] + sum(arr.slice(1));
    }
}

eval方法

1
2
3
function sum(arr) {
return eval(arr.join("+"));
};

3.移除数组中的元素

移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回

示例1

输入

1
[1, 2, 2, 3, 4, 2, 2], 2

输出

1
[1, 3, 4]

迭代方法

1
2
3
4
5
function remove(arr, item) {
return arr.filter(function(it,index,arr){
return (it!==item)
});
}

常规方法

1
2
3
4
5
6
7
8
9
function remove(arr,item){
var a=[];
for(var i=0;i<arr.length;i++){
if(arr[i]!==item){
a.push(arr[i]);
}
}
return a;
}

splice方法

1
2
3
4
5
6
7
8
9
10
11
function remove(arr, item) {
var a = arr.slice(0);
for (var i = 0; i < arr.length; i++) {
//注意:应该是新数组a中的元素和item进行比较
if (a[i] == item) {
a.splice(i, 1);
i--;
}
}
return a;
}

4. 移除数组中的元素(2)

移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回

示例1

输入

1
[1, 2, 2, 3, 4, 2, 2], 2

输出

1
[1, 3, 4]

我写的:

1
2
3
4
5
6
7
8
9
10
11
12
13
function removeWithoutCopy(arr, item) {
for(var i=0;i<arr.length;i++){
if(arr[i]==item){
for(var j=i;j<arr.length;j++){
arr[j]=arr[j+1];
}
arr.pop();
//注意需要i--,否则会漏判断数组元素
i--;
}
}
return arr;
}

讨论区答案

1
2
3
4
5
6
7
8
9
function removeWithoutCopy(arr, item) {
for(var i=0;i<arr.length;i++){
if(arr[i]==item){
arr.splice(i,1);
i--;
}
}
return arr;
}

5.添加元素(1)

在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组

示例1

输入

1
[1, 2, 3, 4],  10

输出

1
[1, 2, 3, 4, 10]

我写的:

1
2
3
function append(arr, item) {
return arr.concat(item);
}

普通迭代拷贝:

1
2
3
4
5
6
7
8
function append(arr, item) {
var a=[];
for(var i=0;i<arr.length;i++){
a.push(arr[i]);
}
a.push(item);
return a;
}

slice拷贝数组

1
2
3
4
5
6
function append(arr, item) {
var a=[];
a=arr.slice(0);
a.push(item);
return a;
}

6.删除数组最后一个元素

删除数组 arr 最后一个元素。不要直接修改数组 arr,结果返回新的数组

示例1

输入

1
[1, 2, 3, 4]

输出

1
[1, 2, 3]

我写的

1
2
3
4
5
function truncate(arr) {
var a=arr.slice(0);
a.pop();
return a;
}

利用slice

1
2
3
functiontruncate(arr) {
return arr.slice(0,-1);
}

普通拷贝迭代

1
2
3
4
5
6
7
function truncate(arr, item) {
    var newArr=[];
    for(var i=0;i<arr.length-1;i++){
        newArr.push(arr[i]);
    }
    return newArr;
}

其他方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//利用filter
function truncate(arr) {
    return arr.filter(function(v,i,ar) {
        return i!==ar.length-1;
    });
}
//利用push.apply+pop
function truncate(arr) {
    var newArr=[];
    [].push.apply(newArr, arr);
    newArr.pop();
    return newArr;
}
//利用concat+pop
function truncate(arr) {
    var newArr = arr.concat();
    newArr.pop();
    return newArr;
}

7.添加元素(2)

在数组 arr 开头添加元素 item。不要直接修改数组 arr,结果返回新的数组

示例1

输入

1
[1, 2, 3, 4], 10

输出

1
[10, 1, 2, 3, 4]

我写的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//unshift
function prepend(arr, item) {
var a=arr.concat();
a.unshift(item);
return a;
}
//常规方法
function prepend(arr, item) {
var a=[];
a.push(item);
for(var i=0;i<arr.length;i++){
a.push(arr[i]);
}
return a;
}

新思路:

1
2
3
function prepend(arr, item) {
return [item].concat(arr);
}

8.删除数组第一个元素

删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组

示例1

输入

1
[1, 2, 3, 4]

输出

1
[2, 3, 4]

我写的

1
2
3
4
5
6
7
8
9
10
11
12
//slice方法
function curtail(arr) {
return arr.slice(1);
}
//普通循环
function curtail(arr) {
var a=[];
for(var i=1;i<arr.length;i++){
a.push(arr[i]);
}
return a;
}

9.数组合并

合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组

示例1

输入

1
[1, 2, 3, 4], ['a', 'b', 'c', 1]

输出

1
[1, 2, 3, 4, 'a', 'b', 'c', 1]

我写的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function concat(arr1, arr2) {
return arr1.concat(arr2);
}
//普通的拷贝迭代
function concat(arr1, arr2) {
var a=[];
for(var i=0;i<arr1.length;i++){
a.push(arr1[i]);
}
for(var i=0;i<arr2.length;i++){
a.push(arr2[i]);
}
return a;
}

讨论区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//利用slice+push.apply
function concat(arr1, arr2) {
    var newArr=arr1.slice(0);
    [].push.apply(newArr, arr2);
    return newArr;
}
//利用slice+push
function concat(arr1, arr2) {
    var newArr=arr1.slice(0);
    for(var i=0;i<arr2.length;i++){
        newArr.push(arr2[i]);
    }
    return newArr;
}

10.添加元素(3)

在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr,结果返回新的数组

示例1

输入

1
[1, 2, 3, 4], 'z', 2

输出

1
[1, 2, 'z', 3, 4]
1
2
3
4
5
function insert(arr, item, index) {
var a=arr.concat();
a.splice(index,0,item);
return a;
}