一、要求直接在原数组上操作
题目描述:移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回。
输入:[1, 2, 2, 3, 4, 2, 2], 2
输出:[1, 3, 4]
方法1:
正向遍历数组,当数组元素的值与 item 相等时,就使用 splice 方法将其去除,但是要注意下标值的问题,去除一个数组元素后,下标值要减1,这样才能遍历到所有的元素。
function removeWithoutCopy(arr, item) {
for (let i = 0; i < arr.length; i++) {
if (arr[i] === item) {
arr.splice(i, 1);
i--; // 注意这里
}
}
return arr;
}
方法2:
反向遍历数组,当数组元素的值与 item 相等时,就使用 splice 方法将其去除。和正向遍历不同的是,这里没有下标值错乱的问题。
function removeWithoutCopy(arr, item) {
for (let i = arr.length - 1;i >= 0;i--) {
if (arr[i] === item) {
arr.splice(i, 1);
}
}
return arr;
}
方法3:
使用 while 循环
function removeWithoutCopy(arr, item) {
while (arr.indexOf(item) !== -1) {
arr.splice(arr.indexOf(item), 1);
}
return arr;
}
二、 要求不能直接修改数组 arr,结果返回新的数组
题目描述:移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr,结果返回新的数组。
输入:[1, 2, 2, 3, 4, 2, 2], 2
输出:[1, 3, 4]
方法1:
使用 filter 方法
function remove(arr, item) {
return arr.filter(num => {
return num !== item;
})
}
方法2:
使用普通的 for 循环或者 forEach 或者 for of,将和 item 不相等的元素放入一个新的数组中。
function remove2(arr, item) {
let result = [];
// for (let i = 0; i < arr.length; i++) {
// if (arr[i] !== item) {
// result.push(arr[i]);
// }
// }
// arr.forEach(num => {
// if (num !== item) {
// result.push(num);
// }
// });
for (let num of arr) {
if (num !== item) {
result.push(num);
}
}
return result;
}
方法3:
先使用 set 把原数组去重,这样数组中只剩下一个item了,再找到item的下标,使用splice去除。
function remove3(arr ,item) {
let result = [...new Set(arr)];
result.splice(result.indexOf(item),1);
return result;
}
前端学习交流QQ群,群内学习讨论的氛围很好,大佬云集,期待您的加入:862748629 点击加入