使用 for 循环删除 JavaScript 中数组中的子数组
Delete a subarray in an array in JavaScript using for loop
如果子数组有特定元素,我需要删除它。
function filteredArray(arr, elem) {
let newArr = [];
for (let i = 0; i < arr.length; i++){
for (let j = 0; j < arr[i].length; j++) {
if (arr[i][j] === elem) {
arr.splice(i--, 1);
newArr = [...arr]
}
}
}
return newArr;
}
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 19));
如果元素只被找到一次(例如 19),上面的代码就可以正常工作。但是如果我尝试数字 3,我会得到:Uncaught TypeError: Cannot read property 'length' of undefined
。有人可以解释一下这里发生了什么吗?
尝试Array.filter()
function filteredArray(arr, skip) {
return arr.filter(function(sub) {
return -1 === sub.indexOf(skip);
});
}
var mixed = [[3, 2, 3], [1, 6, 2], [3, 13, 26], [19, 3, 9]];
console.log(filteredArray(mixed, 19));
console.log(filteredArray(mixed, 3));
使用 filter()
with includes()
就足够简洁了,您可能不需要单独的函数:
let array = [[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]]
let filtered = array.filter(item => !item.includes(19));
console.log(filtered)
问题是,一旦您从数组中 splice
d 了一个项目,您的程序就会继续迭代删除的内部数组的其余部分,就好像它仍然存在一样。在 3
作为目标的情况下,每个内部数组都会被删除,因为它们都包含一个 3
。在最后一次删除时,您检测到 3
位于内部数组的索引 1
和 splice
最后一个内部数组。在循环的下一次迭代中,程序崩溃试图索引到空数组 []
.
中的 [0][2]
解决方法是增加一条break
语句如下;这将中止对已删除数组的进一步检查:
function filteredArray(arr, elem) {
let newArr = [];
for (let i = 0; i < arr.length; i++){
for (let j = 0; j < arr[i].length; j++) {
if (arr[i][j] === elem) {
arr.splice(i--, 1);
newArr = [...arr]
break;
}
}
}
return newArr;
}
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));
话虽如此,您可以采用许多更简单的方法;例如,使用 array.filter()
,它根据其参数函数返回的真值选择元素:
const filteredArray = (a, target) => a.filter(e => !e.includes(target));
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 19));
如果子数组有特定元素,我需要删除它。
function filteredArray(arr, elem) {
let newArr = [];
for (let i = 0; i < arr.length; i++){
for (let j = 0; j < arr[i].length; j++) {
if (arr[i][j] === elem) {
arr.splice(i--, 1);
newArr = [...arr]
}
}
}
return newArr;
}
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 19));
如果元素只被找到一次(例如 19),上面的代码就可以正常工作。但是如果我尝试数字 3,我会得到:Uncaught TypeError: Cannot read property 'length' of undefined
。有人可以解释一下这里发生了什么吗?
尝试Array.filter()
function filteredArray(arr, skip) {
return arr.filter(function(sub) {
return -1 === sub.indexOf(skip);
});
}
var mixed = [[3, 2, 3], [1, 6, 2], [3, 13, 26], [19, 3, 9]];
console.log(filteredArray(mixed, 19));
console.log(filteredArray(mixed, 3));
使用 filter()
with includes()
就足够简洁了,您可能不需要单独的函数:
let array = [[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]]
let filtered = array.filter(item => !item.includes(19));
console.log(filtered)
问题是,一旦您从数组中 splice
d 了一个项目,您的程序就会继续迭代删除的内部数组的其余部分,就好像它仍然存在一样。在 3
作为目标的情况下,每个内部数组都会被删除,因为它们都包含一个 3
。在最后一次删除时,您检测到 3
位于内部数组的索引 1
和 splice
最后一个内部数组。在循环的下一次迭代中,程序崩溃试图索引到空数组 []
.
[0][2]
解决方法是增加一条break
语句如下;这将中止对已删除数组的进一步检查:
function filteredArray(arr, elem) {
let newArr = [];
for (let i = 0; i < arr.length; i++){
for (let j = 0; j < arr[i].length; j++) {
if (arr[i][j] === elem) {
arr.splice(i--, 1);
newArr = [...arr]
break;
}
}
}
return newArr;
}
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));
话虽如此,您可以采用许多更简单的方法;例如,使用 array.filter()
,它根据其参数函数返回的真值选择元素:
const filteredArray = (a, target) => a.filter(e => !e.includes(target));
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 19));