我有一个包含一些字段的接口:
interface Item {
id: number;
name: string;
}
Run Code Online (Sandbox Code Playgroud)
我想实现一个方法removeItemsWithName(items: Item[], name: string),从给定的数组中删除所有具有给定名称的项目:
const myItems: Item[] = [
{ id: 1, name: 'foo' },
{ id: 2, name: 'foo' },
{ id: 3, name: 'bar' }
];
removeItemsWithName(myItems, 'foo');
console.log(myItems);
Run Code Online (Sandbox Code Playgroud)
结果应该是:
[{id: 3, name: 'bar'}]
Run Code Online (Sandbox Code Playgroud)
typescript/javascript 中是否有可用的方法array.removeIf()(如Collection.removeIf()Java 8),以便我的方法看起来类似于以下内容:
[{id: 3, name: 'bar'}]
Run Code Online (Sandbox Code Playgroud)
我已经发现问题Remove array element based on object property,但我需要修改原始数组而不是创建一个新数组(就像array.filter()做的那样)。我还想删除符合条件的所有项目,而不仅仅是第一个。
p.s*_*w.g 12
标准解决方案是filter,但这会返回一个新数组:
function removeItemsWithName(items: Item[], name: string): Item[] {
return items.filter(i => i.name !== name);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果您确实需要就地修改数组,则必须使用以下内容:
function removeItemsWithName(items: Item[], name: string): void {
let j = 0;
for (let i = 0; i < items.length; i++) {
const item = items[i];
if (item.name !== name) {
items[j] = item;
j++;
}
}
items.length = j;
}
Run Code Online (Sandbox Code Playgroud)
或与splice:
function removeItemsWithName(items: Item[], name: string): void {
for (let i = 0; i < items.length; i++) {
if (items[i].name === name) {
items.splice(i--, 1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
或者你可以使用像 lodash 这样的库,它有一个方便的remove方法:
import _remove from 'lodash/remove';
function removeItemsWithName(items: Item[], name: string): void {
_remove(items, x => x.name === name);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14814 次 |
| 最近记录: |