常用数组操作方法
2018-03-09 本文已影响19人
rain_li
(最近除了项目在练习自己的编程能力,以下是牛客网练习的知识点小总结🍭 )
注意:数组相关学习建议到MDN学习
https://developer.mozilla.org
关于用到的方法在下面代码中都会有注释
1.查找数组元素位置
eg: 找出元素 item 在给定数组 arr 中的位置
- 解决方案
for循环
function indexOf(arr, item) {
if (Array.prototype.indexOf) {
return arr.indexOf(item); // 可返回某个指定的字符串值在字符串中首次出现的位置
} else {
for (var i=0; i<arr.length; i++) {
if (arr[i] === item) {
return i;
}
}
}
return -1;
}
2.数组求和
eg: 计算给定数组 arr 中所有元素的总和
- 解决方案
(1)for循环
(2)reduce方法
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)); // sum(arr.slice(1) 递归。每次把第一个取出来
// }
return arr.reduce(function(acc, curr) {
return acc + curr // 累计的结果+当前的知道为空
})
}
3-1.移除数组中的元素(返回新数组)
eg:移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr,结果返回新的数组
- 解决方案
(1)for循环
(2)filter过滤方法
function remove(arr, item) {
// var arr2 = [];
// for (var i=0; i<arr.length; i++) {
// if (arr[i] != item) { // 循环一遍,看等不等于item项,不等于插入新数组
// arr2.push(arr[i]);
// }
// }
// return arr2; // 返回新数组
return arr.filter(function(ele){
return ele != item;
})
}
3-2.移除数组中的元素(直接在数组上操作,并将结果返回)
eg:移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回
- 解决方案
(1)splice方法
function removeWithoutCopy(arr, item) {
for (var i=0; i<arr.length; i++) {
if (arr[i] === item) {
arr.splice(i, 1) // 从下标i开始,删除一个长度 从i开始,J长度,z操作值
i--; // 永远从1开始
}
}
return arr
}
4-1.末尾添加元素
eg:在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组
- 解决方案
(1)for循环
(2)slice+push 尾部插入方法
function append(arr, item) {
// var arr1 = [];
// for (var i=0; i<arr.length; i++) {
// arr1.push(arr[i])
// }
// arr1.push(item)
// return arr1;
var arr1 = arr.slice(0); // slice(0) 从0位置开始知道以后
arr1.push(item)
return arr1;
}
4-2 头部添加元素
eg :在数组 arr 开头添加元素 item。不要直接修改数组 arr,结果返回新的数组
- 解决方案
(1)for循环+unshift头部插入
(2)slice方法+unshift头部插入
(3)concat连接方法
function prepend(arr, item) {
// var newarr=[];
// for (var i=0; i<arr.length; i++) {
// newarr.push(arr[i])
// }
// newarr.unshift(item); // unshift 从头部插入
// return newarr;
// var newarr = arr.slice(0); // 从0开始到最后复制到新的数组
// newarr.unshift(item);
// return newarr;
return [item].concat(arr);
}
4-3 任意位置添加元素
eg:
在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr,结果返回新的数组
- 解决方案
(1)for + splice
(2)slice拷贝 + splice 添加方法
function insert(arr, item, index) {
// var newarr=[];
// for (var i=0; i<arr.length; i++) {
// newarr.push(arr[i])
// }
// newarr.splice(index,0,item)
// return newarr;
var newarr = arr.slice(0);
newarr.splice(index,0,item); // 从index开始删除0,在index后添加item
return newarr;
}
5-1.删除数组最后一个元素
eg: 删除数组 arr 最后一个元素。不要直接修改数组 arr,结果返回新的数组
- 解决方案
(1)slice方法
(2)apply+pop删除最后一个数组方法
function truncate(arr) {
var newarr = [];
[].push.apply(newarr, arr);
newarr.pop(); // pop删除最后一个数组元素
return newarr;
// return arr.slice(0, -1); // slice从位置0开始到后一个
}
5-2.删除数组第一个元素
eg: 删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组
- 解决方案
(1)slice方法
(2)filter过滤方法
function curtail(arr) {
// var newarr = arr.slice(1); // 拷贝 从下标为1开始到最后全部拷贝
// return newarr;
return arr.filter(function(v, i){
return i !== 0;
})
}
6. 数组合并
eg: 合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组
- 解决方案
(1)slice拷贝+concat连接
(2)slice拷贝+push插入
function concat(arr1, arr2) {
// return newarr = arr1.slice(0).concat(arr2);
// return newarr = arr1.concat(arr2)
var newarr = arr1.slice(0);
[].push.apply(newarr, arr2);
return newarr;
}
7.计数
eg: 统计数组 arr 中值等于 item 的元素出现的次数
- 解决方案
(1)for
(2)forEach枚举元素
function count(arr, item) {
var j = 0;
// for (var i=0; i<arr.length; i++) {
// if (arr[i] === item) {
// j ++
// }
// }
// return j;
arr.forEach (function (e) {
e == item? j++: 0
})
return j;
}
8.查找重复元素
eg :找出数组 arr 中重复出现过的元素
- 解决方案
(1)for 循环
(2)indexOf 元素所在位置
function duplicates(arr) {
// var a =[], b = []; // a--结果数组,b--arr中数组
// for (var i=0; i<arr.length; i++) {
// if (!b[arr[i]]) { // b里没有a[i]的值
// b[arr[i]] = 1;
// continue;
// }
// b[arr[i]] ++ ;
// }
// for(var i=0; i<b.length; i++) {
// if (b[i] > 1) {
// a.push(i);
// }
// }
// return a;
var result = [];
arr.forEach(function(elem) {
if (arr.indexOf(elem) != arr.lastIndexOf(elem) && result.indexOf(elem) == -1) {
result.push(elem);
}
});
return result;
}
9. 求二次方
eg:
为数组 arr 中的每个元素求二次方。不要直接修改数组 arr,结果返回新的数组
- 解决方案
(1)for 循环
(2)forEach 循环元素
(3)fliter 过滤
(4)map 映射
function square(arr) {
// var newarr = [];
// for (var i=0; i<arr.length; i++) {
// newarr.push(arr[i]*arr[i]);
// }
// return newarr;
// arr.forEach(function(elem){
// newarr.push(elem*elem);
// })
// return newarr;
return arr.map(function(item, index, arry){
return item * item;
})
}
10. 查找元素位置
eg: 在数组 arr 中,查找值与 item 相等的元素出现的所有位置
- 解决方案
(1)for
(2)filter
(3)indexOf
function findAllOccurrences(arr, target) {
var newarr = [];
arr.filter(function(item, index){
// if (item !== target) {
// newarr.push(index);
// }
item !== target || newarr.push(index);
})
return newarr;
}