如果条件匹配,打字稿数组删除项目

Sam*_*ipp 4 arrays typescript

我有一个包含一些字段的接口:

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)