javascript 删除元素 数组-javascript中删除链表元素的7种方法

javascript中删除链表元素的7种方法

在JavaScript中,不只是Object,Array类型(字段)估计是最常用的类型。 与其他语言中的链表相比,JavaScript 中的数组非常灵活。 这些灵活性既有优点也有缺点。 优点是具有创造性,可以提供各种灵活的解决方案;

调侃了几句,回到题外话,这里介绍一下 JavaScript 中删除 Array 元素的 7 种方法,分别是 length 属性的使用、delete 关键字、pop() 堆栈方法、shift() 队列方法、以及splice()操作模式、forEach()或filter()迭代模式和prototype原型模式。

长度属性

JavaScript 中 Array 的 length 属性非常有特点——它不是只读的。 因此,您可以通过设置此属性从链接列表末尾删除项目或添加新项目。

var colors = ["red", "blue", "grey"]; // 创建一个包含3个字符串的数组
colors.length = 2;
console.log(colors[2]); // undefined

删除关键字

JavaScript 提供了一个delete 关键字来删除(移除)链表元素。

var colors = ["red", "blue", "grey", "green"];
delete colors[0];
console.log(colors); // [undefined, "blue", "grey", "green"]

需要注意的是,如果使用delete删除一个元素,链表的宽度不会改变,但删除的元素会被设置为undefined。

pop() 堆栈方法

JavaScript中的Array对象提供了pop()栈方法,用于弹出并返回链表中的最后一项,一定程度上可以用作删除。

栈数据结构的访问规则是FILO(FirstInLastOut,先进后出)。 堆栈操作将项目添加到堆栈顶部并从堆栈顶部删除项目。 使用pop()方法,它可以移除链表中的最后一项并返回该项,但链表的宽度会减少1。

var colors = ["red", "blue", "grey"];
var color = colors.pop();
console.log(color); // "grey"
console.log(colors.length); // 2

可以看到,当调用pop()方法时,链表返回最后一项,即“灰色”,而链表中只有两个元素。

shift() 队列模式

JavaScript中的Array对象提供了shift()队列方法,用于弹出和返回链表中的第一项,某种程度上也可以用作删除。

队列数据结构的访问规则是FIFO(FirstInFirstOut,先进先出)。 队列在列表末尾添加项目并从列表后端删除项目。 使用shift()方法,还可以删除链表中的第一项。 item 并返回该项,但链表的宽度减少 1。

var colors = ["red", "blue", "grey"];
var color = colors.shift();
console.log(color); // "red"
console.log(colors.length); // 2

可以看到,当调用shift()方法时,链表返回第一项,即“红色”,而链表中只有两个元素。

splice()操作模式

JavaScript 的 Array 对象中提供了 splice() 方法,用于对链表进行特定操作。 splice() 可能被认为是最强大的链表方法。 有很多使用方法。 这里我们只介绍删除链表元素的方法。 删除链表元素时,可以删除任意数量的项,只需要指定2个参数:第一个要删除的项的位置和要删除的项数。

var colors = ["red", "blue", "grey"];
var color = colors.splice(0, 1);
console.log(color); // "red"
console.log(colors); // ["blue", "grey"]

可以看到,当调用splice(0,1)方法时,链表从第一项开始,删除一项。

迭代法

所谓迭代法,就是用循环来迭代链表的元素,删除与要删除的项匹配的项。 用得最多的地方可能是当字段中的元素是对象时,可以根据对象的某个属性(比如ID)来删除链表元素。

第一个使用最常见的 ForEach 循环来比较找到的元素,然后删除它们。

var colors = ["red", "blue", "grey"];
colors.forEach(function(item, index, arr) {
    if(item === "red") {
        arr.splice(index, 1);
    }
});

可以看到,这里也是使用了splice()方法来实现删除的,循环只是为了查找特定的元素。 另一种思路是循环将不需要删除的元素放入新的链表中,这样也可以达到误删除特定元素的目的。

第二种方式是我们在循环中使用过滤器。

var colors = ["red", "blue", "grey"];
colors = colors.filter(function(item) {
    return item != "red"
});
 
console.log(colors); // ["blue", "grey"]

代码非常简单。 找出元素不为红色的项数,将其返回为颜色(虽然得到了新的链表,并且没有对原链表进行删除操作)。 一定程度上已经达到了删除特定元素的目的。

原型原型模式

通过在Array的原型上添加方法就可以达到删除的目的。

Array.prototype.remove = function(dx) {
  if(isNaN(dx) || dx > this.length){
    return false;
  }
  for(var i = 0, n = 0; i < this.length; i++) {
    if(this[i] != this[dx]) {
      this[n++] = this[i];
    }
  }
  this.length -= 1;
};
var colors = ["red", "blue", "grey"];
colors.remove(1);
console.log(colors); // ["red", "grey"]

虽然这些技术都是自己实现一个删除逻辑,然后在Array的原型对象上添加删除方法,但是这个环境下的所有Array对象都可以使用这个方法。 尽管可以这样做,但不建议在生产程序中更改本机对象的原型。 原因很简单,如果只是某个实现中缺少某个方法javascript 删除元素 数组,就把这个方法添加到原生对象的原型中,这样当代码在另一个支持这个方法的实现中运行时,就可能会引起命名冲突。 而这样做可能会意外地导致本机方法被重绘。

“当别人关注你时javascript 删除元素 数组,你就会敞开心扉。你认为这是谦虚,尽管这往往是由于孤独。”

你要成为一个成年人,不要回头,不要悲伤。