JS常见操作(一)

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

解决思路: 该类型要求在给定的数组上进行操作,此时我们便不可使用filter过滤器,因为filter过滤器是返回一个新数组的,在这里,我将介绍两种方法:

方法一: 使用数组的indexOf方法,在while循环中,一直寻找与item相等的元素是否存在,如果存在,则调用数组的splice()方法,删除指定位置的元素,JS代码如下:

function removeWithoutCopy(arr, item) {
     
    while(arr.indexOf(item) !== -1) {
     
        arr.splice(arr.indexOf(item), 1)
    }
    return arr
}

方法二: 可以采用for循环,从尾部开始遍历,因为这样子可以排除由于元素位置变动的影响,从尾部开始删除,元素位置仍然不变,但是如果从头部(即下标为0)开始遍历的话,当我们删除一个元素时,例如我们删除下标为1的元素时,则从下标为2开始的元素都需要在数组中往前移动一格,最后将会导致我们的元素删除不干净.JS代码如下:

function removeWithoutCopy(arr, item) {
     
    for(let i = arr.length - 1; i > 0; i--) {
     
        if (arr[i] === item) {
     
            arr.splice(i, 1);
        }
    }
    return arr
}

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

解决思路: 由于题目要求不改变原数组,那么显然,我们都会想到直接将原数组arr拷贝一份给新数组,然后添加元素就好了,但是我们要想到,在js中,这种叫做浅拷贝 ,此时的两个数组是共同使用一份地址空间的,如下图所示,此时两个数组中若有一个元素发生改变,则另一个数组也会发生改变。

JS常见操作(一)_第1张图片
那么既然有浅拷贝,那就有着对应的深拷贝,使用方法如下:
1.使用JSON.stringify和JSON.parse

var newArr = JSON.parse(JSON.stringify(arr));

深拷贝是不会共用一份地址空间的,两个数组会有两个对应的内存分配给他们,此时互不影响,所以该类型题的JS代码我们可以写成:

function append(arr, item) {
     
    var newArr = JSON.parse(JSON.stringify(arr))
    newArr.push(item)
    return newArr
}

你可能感兴趣的:(前端,javascript)