数组方法重构与迭代
Posted 流走的年华
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组方法重构与迭代相关的知识,希望对你有一定的参考价值。
数组方法重构
1.Array.prototype.pop()
(1) pop()方法用于删除数组的最后一个元素并返回删除的元素。
注意:此方法会改变数组的长度!
语法:array.pop()
返回值:所有类型 返回删除的元素
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.pop();
console.log(fruits);
//fruits 结果输出:Banana,Orange,Apple
(2) 重构pop()方法
Array.prototype.myPop = function(){
if(this.length==\'\'){
return undefined;
}else{
var result = this[this.length-1];
this.length--;
return result;
}
}
var arr = [1,2,3,4,5];
console.log(arr);
var result = arr.myPop();
console.log(result);
结果如图:![图片.png](/img/bVcUyCl)
2.Array.prototype.push()
(1)push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
注意:新元素将添加在数组的末尾,此方法改变数组的长度
语法:array.push(item1, item2, ..., itemX)
返回值:Number 数组新长度
var fruits = ["Banana", "Orange", "Apple", "Mango"];
// push() 添加元素到末尾 参数是要添加的元素 返回值是修改之后数组的长度【改变原数组】
fruits.push("Kiwi")
console.log(fruits);
//fruits 结果输出:Banana,Orange,Apple,Mango,Kiwi
(2)push()方法重构
Array.prototype.myPush = function(){
for(var i = 0; i<arguments.length; i++){
this[this.length]=arguments[i];
}
}
var arr = [1,2,3,4,5];
console.log(arr);
var result = arr.myPush(\'a\');
console.log(result);
结果如图:![图片.png](/img/bVcUyCC)
3.Array.prototype.shift()
(1) shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值。
注意:此方法改变数组的长度!
返回值:任何类型(*) 数组原来的第一个元素的值(移除的元素)。
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.shift()
console.log(fruits);
//fruits结果输出:Orange,Apple,Mango
(2) shift()方法重构
Array.prototype.myShift = function(){
var result = this[0];
for(var i=0; i<this.length; i++){
this[i]=this[i+1];
}
this.length--;
return result;
}
var arr = [1,2,4,5];
console.log(arr);
var result = arr.myShift();
console.log(result);
console.log(arr);
结果如图:![图片.png](/img/bVcUyCV)
4.Array.prototype.myUnshift()
(1)unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
注意:该方法将改变数组的数目
语法:array.unshift(item1,item2, ..., itemX)
参数:item1,item2,...,itemX 描述:可选。向数组起始位置添加一个或者多个元素
返回值:Type 描述 Number 数组新长度
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.unshift("Lemon","Pineapple");
console.log(fruits)
//fruits 将输出:Lemon,Pineapple,Banana,Orange,Apple,Mango
(2)unshift() 方法重构
Array.prototype.myUnshift = function(){
var sum = this.length+arguments.length;
for(var i=sum; i>0; i--){
if(i>arguments.length){
this[i-1]=this[i-1-arguments.length];
}else{
this[i-1]=arguments[i-1];
}
}
return sum;
}
var arr = [1,2,3,4,5];
console.log(arr);
var result = arr.myUnshift(\'a\',\'b\',\'c\');
console.log(result);
console.log(arr);
结果如图:![图片.png](/img/bVcUyDM)
迭代方法重构
1.Array.prototype.forEach()
(1)forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数
注意: forEach() 对于空数组是不会执行回调函数的。
语法:array.forEach(function(currentValue, index, arr), thisValue)
参数:
参数 | 描述 |
---|
function(currentValue, index, arr) | 必需。 数组中每个元素需要调用的函数。 |
thisValue | 可选。传递给函数的值一般用 "this" 值。 如果这个参数为空, "undefined" 会传递给 "this" 值 |
参数 | 描述 |
---|
currentValue | 必需。当前元素 |
index | 可选。当前元素的索引值。 |
arr | 可选。当前元素所属的数组对象。 |
返回值:undefined
var numbers = [4, 9, 16, 25];
numbers.forEach(function (number, index) {
console.log(index + \' -- \' + number);
})
// 0 -- 4
// 1 -- 9
// 2 -- 16
// 3 -- 25
(2) forEach()方法重构
Array.prototype.myForEach = function(fun,){
for(var i=0; i<this.length; i++){
fun(this[i],i,this);
}
}
var arr = [1,2,3];
var result = arr.myForEach(function(){
console.log(item,index,arr);
});
console.log(result);
2.Array.prototype.every()
(1)every() 方法用于检测数组所有元素是否都符合指定条件(通过函数提供)。
every() 方法使用指定函数检测数组中的所有元素:
a.如果数组中检测到有一个元素不满足,则整个表达式返回 *false* ,且剩余的元素不会再进行检测。
b.如果所有元素都满足条件,则返回 true。
注意: every() 不会对空数组进行检测。every() 不会改变原始数组。
语法:array.every(function(currentValue,index,arr), thisValue)
参数:
参数 | 描述 |
---|
function(currentValue, index,arr)* | 必须。函数,数组中的每个元素都会执行这个函数 函数参数见下表 |
thisValue | 可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue ,"this" 的值为 "undefined" |
参数 | 描述 |
---|
currentValue | 必须。当前元素的值 |
index | 可选。当前元素的索引值 |
arr | 可选。当前元素属于的数组对象 |
返回值:布尔值。如果所有元素都通过检测返回 true,否则返回 false。
检测数组 *ages* 的所有元素是否都大于等于 18 :
var ages = [32, 33, 16, 40];
var result = ages.every(function (age) {
return age >= 18
})
console.log(result);//输出结果为:false
(2)every()方法重构
Array.prototype.myEvery = function(fun,obj){
for(var i=0; i<this.length; i++){
if(!(obj?fun.bind(obj)(this[i]):fun(this[i]))){
return false;
}
}
return true;
}
var arr = [1,2,3,4,5];
var result = arr.myEvery(function(item){
console.log(this);//指向全局
return item>1;//短路原则
},{name:\'zhangsan\'})//第二个对象存在时this指向这个对象
console.log(result);
3.Array.prototype.some();
(1)some() 方法用于检测数组中的元素是否满足指定条件(函数提供)
some() 方法会依次执行数组的每个元素:
a.如果有一个元素满足条件,则表达式返回*true* , 剩余的元素不会再执行检测。
b.如果没有满足条件的元素,则返回false。
注意: some() 不会对空数组进行检测。some() 不会改变原始数组。
语法:array.some(function(currentValue,index,arr),thisValue)
参数:
参数 | 描述 |
---|
function(currentValue, index,arr) | 必须。函数,数组中的每个元素都会执行这个函数 函数参数见下表 |
thisValue | 可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue ,"this" 的值为 "undefined" |
参数 | 描述 |
---|
currentValue | 必须。当前元素的值 |
index | 可选。当前元素的索引值 |
arr | 可选。当前元素属于的数组对象 |
返回值:布尔值。如果数组中有元素满足条件返回 true,否则返回 false。
//检测数组中是否有元素大于 18:
var ages = [32, 33, 16, 40];
var result = ages.some(function (age) {
return age >= 18
})
console.log(result);//输出结果为:true
(2)some()方法重构
Array.prototype.mySome = function(fun,obj){
for(var i=0; i<this.length; i++){
if(obj?fun.bind(obj)(this[i]):fun(this[i])){
return true;
}
}
return false;
}
var arr = [1,2,3,4,5];
var result = arr.mySome(function(item){
console.log(this);
return item>1;
},{name:\'zhangsan\'});
console.log(result);
4.Array.prototype.filter()
(1)filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。
注意: filter() 不会对空数组进行检测。 filter() 不会改变原始数组。
语法:array.filter(function(currentValue,index,arr), thisValue)
参数:
参数 | 描述 |
---|
function(currentValue, index,arr) | 必须。函数,数组中的每个元素都会执行这个函数 函数参数见下表 |
thisValue | 可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue ,"this" 的值为 "undefined" |
参数 | 描述 |
---|
currentValue | 必须。当前元素的值 |
index | 可选。当前元素的索引值 |
arr | 可选。当前元素属于的数组对象 |
返回值:返回数组,包含了符合条件的所有元素。如果没有符合条件的元素则返回空数组。
//返回数组 *ages* 中所有元素都大于 18 的元素:
var ages = [32, 33, 16, 40];
var result = ages.filter(function (age) {
return age >= 18
})
console.log(result);//输出结果为:[ 32, 33, 40 ]
(2)filter()方法重构
Array.prototype.myFilter = function(fun,obj){
var result = [];
for(var i=0; i<this.length; i++){
if(obj?fun.bind(obj)(this[i]):fun(this[i])){
result.push(this[i]);
}
}
return result;
}
var arr = [1,2,3,4,5];
var result = arr.myFilter(function(item){
console.log(this);
return item>2;
},{name:\'zhangsan\'});
console.log(result);
5.Array.prototype.map()
(1)map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
map() 方法按照原始数组元素顺序依次处理元素。
注意:map() 不会对空数组进行检测。map() 不会改变原始数组。
语法:array.map(function(currentValue,index,arr), thisValue)
参数:
参数 | 描述 |
---|
function(currentValue, index,arr) | 必须。函数,数组中的每个元素都会执行这个函数 函数参数见下表 |
thisValue | 可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。 |
参数 | 描述 |
---|
currentValue | 必须。当前元素的值 |
index | 可选。当前元素的索引值 |
arr | 可选。当前元素属于的数组对象 |
返回值:返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。
//返回一个数组,数组中元素为原始数组的平方根:
var numbers = [4, 9, 16, 25];
var result = numbers.map(function (number) {
return Math.sqrt(number)
})
console.log(result);//输出结果为:[ 2, 3, 4, 5 ]
Array.prototype.myMap = function(fun,obj){
var result = [];
for(var i=0; i<this.length; i++){
result.push(obj?fun.bind(obj)(this[i]):fun(this[i]));
}
return result;
}
var arr = [1,2,3,4,5];
var result = arr.myMap(function(item){
console.log(this);//全局对象
return item+1;//新数组 数组元素+1
},{name:\'zhangsan\'})//此时this指向name
console.log(result);
以上是关于数组方法重构与迭代的主要内容,如果未能解决你的问题,请参考以下文章
如何重构这个 Java 代码片段
代码组织与重构原则
VSCode自定义代码片段—— 数组的响应式方法
VSCode自定义代码片段10—— 数组的响应式方法
如何在UL中迭代使用appendChild和片段LI?
如何重构仅使用循环和简单数组的代码?