繁体   English   中英

使用传播从数组中删除元素

[英]Remove elements from array using spread

我有一组动物arr = ['cat','dog','elephant','lion','tiger','mouse']

我想编写一个函数remove(['dog','lion'])可以从 arr 中删除元素,我们可以使用 es6 spread 编写这个函数吗?

例子:

arr = ['cat','dog','elephant','lion','tiger','mouse']
remove(['cat', 'lion'])

arr 应该更改为

arr = ['dog','elephant','tiger','mouse']

注意:我不想要突变,所以请不要建议突变数组的解决方案。

不,你不能,因为它们并不相邻。 有一些关于进一步采用扩展和休息语法的讨论,但即使在这些讨论中,我也不认为一系列不连续的选择是可能的。

我认为你能得到的最接近的是专门调出前几个,然后对'lion'之后'lion'所有内容使用 rest 语法:

 const arr = ['cat','dog','elephant','lion','tiger','mouse']; const arr2 = [arr[1], arr[2], ...arr.slice(4)]; console.log(arr2);

...我确定这不是你想要做的。 :-)

据我了解,您正在寻找一个使用扩展语法定义其参数的函数。 下面是一个例子:

 var arr = ['cat','dog','elephant','lion','tiger','mouse']; function remove(...toRemove){ toRemove.forEach(item => { var index = arr.indexOf(item); if(index != -1){ arr.splice(index, 1); } }) } remove('dog', 'lion'); // OR remove(...['dog', 'lion']); console.log(arr);

这实际上是在改变原始数组(它改变了它)你已经提到你不是在寻找变异,但你也提到这个arr 应该改为......

如果你想传递很多字符串,比如remove('lion', 'dog')你可以使用 spread 。 否则我不认为传播可以帮助你。

您可以使用迭代器并使用扩展运算符从迭代中排除值。

顺便说一句,这不是真的可取。

 function remove(array, items) { array[Symbol.iterator] = function* () { for (let value of Object.values(this)) { if (!items.includes(value)) { yield value; } } }; } var array = ['cat', 'dog', 'elephant', 'lion', 'tiger', 'mouse']; remove(array, ['dog', 'lion']); console.log([...array]); console.log(array);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

我不明白所选的答案

const items = ['cat', 'dog', 'elephant', 'lion', 'tiger', 'mouse']
const valuesToRemove = ['dog', 'lion']
const filteredItems = items.filter(item => !valuesToRemove.includes(item))

您可以使用 array.filter 方法,它将返回带有过滤值的数组,

var filterMe = ["cat", "dog", "elephant", "lion", "tiger", "mouse"];
var answer = filterMe.filter((item) => item !== "dog")
                     .filter((item) => item !== "lion");
console.log(answer);

类似于前面的过滤器解决方案,但使用正则表达式。 如果删除数组很大,则很有用...

 let arr = ['cat', 'dog', 'elephant', 'lion', 'tiger', 'mouse']; const removeArr = ['cat', 'lion']; const removeRegExp = new RegExp(removeArr.join('|')); arr = arr.filter(e => !removeRegExp.test(e)); console.log(arr);

如果您使用的是 Typescript,您还可以使用Omit实用程序类型从您的对象/数组中删除特定键。

假设这样的界面

interface Todo {
  title: string;
  description: string; // <--- assuming you want to omit `description` key
  completed: boolean;
  createdAt: number;
}
 
type TodoPreview = Omit<Todo, "description">;

TodoPreview类型现在需要一个包含其他成员但decription描述的对象

现在这将是正确的

const todo: TodoPreview = {
  title: "Clean room",
  completed: false,
  createdAt: 1615544252770,
};

这将出错

const todo: TodoPreview = {
  title: "Clean room",
  completed: false,
  description: 'this should not be here' // <--- TS compiler will complain
  createdAt: 1615544252770,
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM