数据结构是算法入门基础,可以更快更好的帮我们处理一些程序逻辑上的问题。
之前接触过数据结构,所以有一个大概的印象,但是没怎么刷过题,趁着暑假赶紧回顾,所有代码都是用JavaScript来进行算法描述,今天就开始正式回顾算法了,如果代码中哪里有错误请及时指出,感谢。
js为我们对数组的操作提供了很多内置方法
参数:参数为向数组中添加的内容,可以为一个或多个,不限制类型
结果:push向数组末尾添加元素,unshift向数组头部添加元素,都会改变原数组
返回值:数组添加完之后的长度
如何实现?
思路:
①push的实现将数组的长度当作索引,之后进行赋值
Array.prototype.myPush = function(){
for(let i=0;i<arguments.length;i++){
this[this.length] = arguments[i];
}
return this.length
}
②unshift需要在数组的头部添加一个或多个,所以需要将后面的其它元素都向后移一位
Array.prototype.myUnshift = function() {
//unshift的实现需要两步
//第一步将原数组中的所有元素向有移动(距离为添加的内容长度)
//第二步将添加的内容依次放入之前按的空位中
let num = arguments.length;
for( let i = 0; i < num; i++ ){
this[i+num] = this[i];
}
for( let j = 0; j < num ; j++){
this[j] = arguments[j];
}
return this.length
}
pop方法删除数组的最后一个元素,返回值为被删除的元素,会改变原数组
shift方法删除数组的最后一个元素,返回值为被删除的元素,会改变原数组
这两个方法都不接收参数,返回值为被删除的元素
实现方法:
// pop的实现
Array.prototype.myPop = function () {
let tailEle = this[this.length - 1];
this.length--;
return tailEle;
}
//shift的实现
//先将所有元素向前移动一位,再将length-1
Array.prototype.myShift = function () {
let headEle = this[0];
for (let i = 1; i < this.length; i++) {
this[i - 1] = this[i]
}
this.length--;
return headEle;
}
splice和concat都可以返回一个新数组
splice的功能非常大,可以删除指定位置的数组元素,也可以向指定位置添加数组元素,使用该方法会改变原数组
参数 | 描述 |
---|---|
index | 必需。整数,规定添加或者删除的位置,支持以负数为索引,为负数则表示从末尾开始 |
howmany | 必需。需要删除的项目数量,设置为0则不会删除元素 |
item,…,itemX | 可选,添加的具体元素 |
返回值为数组,如果是删除的有元素,则数组中内容为删除的元素,其它情况数组都是空数组。
let arr = [1,2,3,4,5]
//添加元素
let result = arr.splice(1,0,4444,5555)
console.log(arr)
console.log(result)
//arr:1,4444,5555,2,3,4,5
//result: []
//删除元素
let result2 = arr.splice(1,2)
console.log(arr)
console.log(result2)
//arr:1,2,3,4,5
//result:[4444,5555]
splice的实现:
<script>
function mySplice(index, howmany, ...items) {
// 先做类型判断,确保输入的都为数字
if (typeof index !== 'number' || typeof howmany !== 'number') {
console.log('请检查输入的类型');
return;
}
//剩余参数的数组长度
let len = items.length;
// 执行删除操作,将范围内的元素删除,也就是将后面的向前移动
if (howmany !== 0) {
// 用于保存返回值的数组
let result = [];
// 将删除的元素保存到数组中,后续作为返回值
for (let i = index; i < index + howmany; i++) {
result[result.length] = this[i];
}
// 从删除的最后一个位置的下一位开始到原数组末尾,依次向前移动howmany个位置
for (let m = index + howmany; m < this.length; m++) {
this[index++] = this[m];
}
//将数组的长度删除删除howmany个长度,
this.length = this.length - howmany;
return result
}
// 添加元素
if (howmany === 0 && len > 0) {
// 说明此时是在指定位置添加元素
// 将数组索引为index的位置向后移动howmany的值,并将items添加进去
//需要注意的是应该从数组的最后开始移动,否则可能会出现赋值错误的情况
//还是分为两步,第一步将数组拆分,需要移动的向后移动
for (let j = this.length - 1; j >= index; j--) {
this[j + len] = this[j];
}
for (let k = 0; k < len; k++) {
this[index++] = items[k];
}
// 数组长度自己会增加
//返回值为空
return []
}
}
Array.prototype.mySplice = mySplice;
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// let result = arr.mySplice(1, 3)
let result2 = arr.mySplice(2, 0, 44, 44)
console.log(result2);
console.log(arr);
</script>
cnocat的实现: