在TypeScript中,我们可以使用多种方法来遍历数组并删除满足条件的元素。需要注意的是,在遍历数组的同时删除元素可能会导致索引错乱,因此需要小心处理。
方法 1:从后向前遍历(推荐)
interface People {
age: number;
sex: number;
}
let peoples: People[] = [
{ age: 8, sex: 1 },
{ age: 10, sex: 1 },
{ age: 7, sex: 2 },
{ age: 12, sex: 2 },
{ age: 5, sex: 1 }
];
// 从后向前遍历,避免索引问题
for (let i = peoples.length - 1; i >= 0; i--) {
if (peoples[i].age > 8) {
peoples.splice(i, 1);
}
}
console.log(peoples);
// 输出: [{ age: 8, sex: 1 }, { age: 7, sex: 2 }, { age: 5, sex: 1 }]
方法 2:使用 while 循环和索引控制
let peoples: People[] = [
{ age: 8, sex: 1 },
{ age: 10, sex: 1 },
{ age: 7, sex: 2 },
{ age: 12, sex: 2 },
{ age: 5, sex: 1 }
];
let i = 0;
while (i < peoples.length) {
if (peoples[i].age > 8) {
peoples.splice(i, 1);
} else {
i++; // 只有不删除时才递增索引
}
}
console.log(peoples);
方法 3:创建新数组(非破坏性)
let peoples: People[] = [
{ age: 8, sex: 1 },
{ age: 10, sex: 1 },
{ age: 7, sex: 2 },
{ age: 12, sex: 2 },
{ age: 5, sex: 1 }
];
const newPeoples: People[] = [];
for (let i = 0; i < peoples.length; i++) {
if (peoples[i].age <= 8) {
newPeoples.push(peoples[i]);
}
}
peoples = newPeoples;
console.log(peoples);
方法 4:使用 for...of 循环和索引记录
let peoples: People[] = [
{ age: 8, sex: 1 },
{ age: 10, sex: 1 },
{ age: 7, sex: 2 },
{ age: 12, sex: 2 },
{ age: 5, sex: 1 }
];
const indexesToRemove: number[] = [];
let index = 0;
// 先记录要删除的索引
for (const person of peoples) {
if (person.age > 8) {
indexesToRemove.push(index);
}
index++;
}
// 从后向前删除,避免索引变化
for (let i = indexesToRemove.length - 1; i >= 0; i--) {
peoples.splice(indexesToRemove[i], 1);
}
console.log(peoples);
方法 5:使用 reduce 构建新数组
let peoples: People[] = [
{ age: 8, sex: 1 },
{ age: 10, sex: 1 },
{ age: 7, sex: 2 },
{ age: 12, sex: 2 },
{ age: 5, sex: 1 }
];
peoples = peoples.reduce((acc: People[], current) => {
if (current.age <= 8) {
acc.push(current);
}
return acc;
}, []);
console.log(peoples);
方法 6:使用 filter 方法(最简洁)
let peoples: People[] = [
{ age: 8, sex: 1 },
{ age: 10, sex: 1 },
{ age: 7, sex: 2 },
{ age: 12, sex: 2 },
{ age: 5, sex: 1 }
];
peoples = peoples.filter(person => person.age <= 8);
console.log(peoples);
推荐建议
方法 1(从后向前遍历) 是最推荐的,因为它直接在原数组上操作且避免了索引问题
方法 3(创建新数组) 是最安全的,不会影响原数组
方法 6(filter) 是最简洁的函数式写法
避免在正向遍历时使用 splice,这会导致索引错乱的问题
选择哪种方法取决于你的具体需求:是否需要修改原数组、性能要求、代码可读性等因素。