كيف يمكنني إزالة عنصر معين من المصفوفة؟

سئل على ٢٤ أبريل ٢٠١١  ·  تمت مشاهدة 7.4M مرة  ·  مصدر

Walker picture
في ٢٤ أبريل ٢٠١١

لدي مجموعة من الأرقام وأنا أستخدم الطريقة .push() لإضافة عناصر إليها.

هل هناك طريقة بسيطة لإزالة عنصر معين من المصفوفة؟

أنا أبحث عن ما يعادل شيئًا مثل:

array.remove(number);

لا بد لي من استخدام الأساسية جافا سكريبت. الأطر غير مسموح بها.

الإجابات

Tom Wadley picture
في ٢٤ أبريل ٢٠١١
12777

ابحث عن index لعنصر المصفوفة الذي تريد إزالته باستخدام indexOf ، ثم قم بإزالة هذا الفهرس باستخدام splice .

تقوم طريقة splice () بتغيير محتويات المصفوفة عن طريق إزالة العناصر الموجودة و / أو إضافة عناصر جديدة.

const array = [2, 5, 9];

console.log(array);

const index = array.indexOf(5);
if (index > -1) {
  array.splice(index, 1);
}

// array = [2, 9]
console.log(array); 

المعلمة الثانية لـ splice هي عدد العناصر المراد إزالتها. لاحظ أن splice يعدل المصفوفة في مكانها ويعيد مصفوفة جديدة تحتوي على العناصر التي تمت إزالتها.


لسبب الاكتمال ، ها هي الوظائف. تزيل الوظيفة الأولى تكرارًا واحدًا فقط (أي إزالة التطابق الأول 5 من [2,5,9,1,5,8,5] ) ، بينما تزيل الوظيفة الثانية جميع التكرارات:

function removeItemOnce(arr, value) {
  var index = arr.indexOf(value);
  if (index > -1) {
    arr.splice(index, 1);
  }
  return arr;
}

function removeItemAll(arr, value) {
  var i = 0;
  while (i < arr.length) {
    if (arr[i] === value) {
      arr.splice(i, 1);
    } else {
      ++i;
    }
  }
  return arr;
}
//Usage
console.log(removeItemOnce([2,5,9,1,5,8,5], 5))
console.log(removeItemAll([2,5,9,1,5,8,5], 5))
Peter Olson picture
في ٢٤ أبريل ٢٠١١
1392

لا أعرف كيف تتوقع أن يتصرف array.remove(int) . هناك ثلاثة احتمالات يمكنني التفكير فيها والتي قد ترغب فيها.

لإزالة عنصر مصفوفة في فهرس i :

array.splice(i, 1);

إذا كنت تريد إزالة كل عنصر بقيمة number من المصفوفة:

for (var i = array.length - 1; i >= 0; i--) {
 if (array[i] === number) {
  array.splice(i, 1);
 }
}

إذا كنت تريد فقط جعل العنصر في الفهرس i غير موجود ، لكنك لا تريد أن تتغير فهارس العناصر الأخرى:

delete array[i];
ujeenator picture
في ١٩ ديسمبر ٢٠١٣
1384

تم تحريره في 2016 أكتوبر

  • افعل ذلك بطريقة بسيطة وبديهية وصريحة ( شفرة أوكام )
  • افعل ذلك غير قابل للتغيير (تبقى المجموعة الأصلية دون تغيير)
  • افعل ذلك باستخدام وظائف JavaScript القياسية ، إذا كان متصفحك لا يدعمها - استخدم polyfill

في مثال الكود هذا ، أستخدم وظيفة "array.filter (...)" لإزالة العناصر غير المرغوب فيها من المصفوفة. هذه الوظيفة لا تغير المصفوفة الأصلية وتنشئ واحدة جديدة. إذا كان متصفحك لا يدعم هذه الوظيفة (على سبيل المثال Internet Explorer قبل الإصدار 9 أو Firefox قبل الإصدار 1.5) ، ففكر في استخدام مرشح polyfill من Mozilla .

إزالة العنصر (ECMA-262 Edition 5 code aka oldstyle JavaScript)

var value = 3

var arr = [1, 2, 3, 4, 5, 3]

arr = arr.filter(function(item) {
    return item !== value
})

console.log(arr)
// [ 1, 2, 4, 5 ]

إزالة العنصر (كود ECMAScript 6)

let value = 3

let arr = [1, 2, 3, 4, 5, 3]

arr = arr.filter(item => item !== value)

console.log(arr)
// [ 1, 2, 4, 5 ]

IMPORTANT ECMAScript 6 "() => {}" بنية وظيفة السهم غير مدعومة في Internet Explorer على الإطلاق ، و Chrome قبل الإصدار 45 ، و Firefox قبل الإصدار 22 ، و Safari قبل الإصدار 10. لاستخدام بناء جملة ECMAScript 6 في المتصفحات القديمة ، يمكنك استخدام BabelJS .


إزالة عدة عناصر (كود ECMAScript 7)

ميزة إضافية لهذه الطريقة هي أنه يمكنك إزالة عناصر متعددة

let forDeletion = [2, 3, 5]

let arr = [1, 2, 3, 4, 5, 3]

arr = arr.filter(item => !forDeletion.includes(item))
// !!! Read below about array.includes(...) support !!!

console.log(arr)
// [ 1, 4 ]

مهمة "array.includes (...)" غير مدعومة في Internet Explorer على الإطلاق ، و Chrome قبل الإصدار 47 ، و Firefox قبل الإصدار 43 ، و Safari قبل الإصدار 9 ، و Edge قبل الإصدار 14 ، لذا فهنا عبارة عن polyfill من Mozilla .

إزالة عدة عناصر (في المستقبل ، ربما)

إذا تم قبول اقتراح "بناء الجملة الملزمة" ، فستتمكن من القيام بذلك:

// array-lib.js

export function remove(...forDeletion) {
    return this.filter(item => !forDeletion.includes(item))
}

// main.js

import { remove } from './array-lib.js'

let arr = [1, 2, 3, 4, 5, 3]

// :: This-Binding Syntax Proposal
// using "remove" function as "virtual method"
// without extending Array.prototype
arr = arr::remove(2, 3, 5)

console.log(arr)
// [ 1, 4 ]

جربها بنفسك في BabelJS :)

مرجع

xavierm02 picture
في ٢٤ أبريل ٢٠١١
501

يعتمد ذلك على ما إذا كنت تريد الاحتفاظ بمكان فارغ أم لا.

إذا كنت لا تريد فتحة فارغة:

array[index] = undefined;

إذا كنت لا تريد فتحة فارغة:

//To keep the original:
//oldArray = [...array];

//This modifies the array.
array.splice(index, 1);

وإذا كنت بحاجة إلى قيمة هذا العنصر ، فيمكنك فقط تخزين عنصر المصفوفة المرتجعة:

var value = array.splice(index, 1)[0];

إذا كنت تريد الإزالة في أي من طرفي المصفوفة ، يمكنك استخدام array.pop() للصفوفة الأخيرة أو array.shift() لأول واحد (كلاهما يُرجع قيمة العنصر أيضًا).

إذا كنت لا تعرف فهرس العنصر ، فيمكنك استخدام array.indexOf(item) للحصول عليه (في if() للحصول على عنصر واحد أو في while() للحصول على كل معهم). يُرجع array.indexOf(item) إما الفهرس أو -1 إذا لم يتم العثور عليه.

Ben Lesh picture
في ١٠ أغسطس ٢٠١٣
296

كان أحد الأصدقاء يواجه مشكلات في Internet Explorer 8 وأظهر لي ما فعله. أخبرته أنه خطأ ، وأخبرني أنه حصل على الجواب هنا. لن تعمل أفضل إجابة حالية في جميع المتصفحات (Internet Explorer 8 على سبيل المثال) ، وستزيل فقط التكرار الأول للعنصر.

إزالة كافة الحالات من مجموعة

function array_remove_index_by_value(arr, item)
{
 for (var i = arr.length; i--;)
 {
  if (arr[i] === item) {arr.splice(i, 1);}
 }
}

يتكرر عبر المصفوفة للخلف (حيث ستتغير الفهارس والطول مع إزالة العناصر) ويزيل العنصر إذا تم العثور عليه. يعمل في جميع المتصفحات.

Sasa picture
في ٢١ ديسمبر ٢٠١٢
192

هناك طريقتان رئيسيتان:

  1. لصق () : anArray.splice(index, 1);

  2. حذف : delete anArray[index];

كن حذرا عند استخدام حذف لمصفوفة. إنه جيد لحذف سمات الكائنات ، ولكنه ليس جيدًا للمصفوفات. من الأفضل استخدام splice للمصفوفات.

ضع في اعتبارك أنه عند استخدام delete لمصفوفة قد تحصل على نتائج خاطئة لـ anArray.length . بمعنى آخر ، سيؤدي delete إلى إزالة العنصر ، لكنه لن يُحدِّث قيمة خاصية length.

يمكنك أيضًا توقع وجود فجوات في أرقام الفهرس بعد استخدام الحذف ، على سبيل المثال قد ينتهي بك الأمر بالحصول على فهارس 1 و 3 و 4 و 8 و 9 و 11 والطول كما كان قبل استخدام الحذف. في هذه الحالة ، ستتعطل جميع الحلقات المفهرسة for ، لأن الفهارس لم تعد متسلسلة.

إذا اضطررت إلى استخدام delete لسبب ما ، فيجب عليك استخدام حلقات for each عندما تحتاج إلى تكرار المصفوفات. في واقع الأمر ، تجنب دائمًا استخدام الحلقات المفهرسة for ، إن أمكن. بهذه الطريقة ستكون الشفرة أكثر قوة وأقل عرضة لمشاكل الفهارس.

Zirak picture
في ٢٤ أبريل ٢٠١١
165
Array.prototype.remove_by_value = function(val) {
 for (var i = 0; i < this.length; i++) {
  if (this[i] === val) {
   this.splice(i, 1);
   i--;
  }
 }
 return this;
}[
 // call like
 (1, 2, 3, 4)
].remove_by_value(3);

Array.prototype.remove_by_value = function(val) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] === val) {
      this.splice(i, 1);
      i--;
    }
  }
  return this;
}

var rooms = ['hello', 'something']

rooms = rooms.remove_by_value('hello')

console.log(rooms)
slosd picture
في ١٩ سبتمبر ٢٠١٣
119

ليست هناك حاجة لاستخدام indexOf أو splice . ومع ذلك ، فإنه يعمل بشكل أفضل إذا كنت تريد فقط إزالة تكرار واحد للعنصر.

البحث والتحرك (التحرك):

function move(arr, val) {
  var j = 0;
  for (var i = 0, l = arr.length; i < l; i++) {
    if (arr[i] !== val) {
      arr[j++] = arr[i];
    }
  }
  arr.length = j;
}

استخدم indexOf و splice (indexof):

function indexof(arr, val) {
  var i;
  while ((i = arr.indexOf(val)) != -1) {
    arr.splice(i, 1);
  }
}

استخدم فقط splice (لصق):

function splice(arr, val) {
  for (var i = arr.length; i--;) {
    if (arr[i] === val) {
      arr.splice(i, 1);
    }
  }
}

أوقات التشغيل على nodejs لمصفوفة تحتوي على 1000 عنصر (متوسط ​​أكثر من 10000 مرة):

indexof أبطأ الحركة . حتى إذا تم تحسينه عن طريق إزالة المكالمة إلى indexOf في لصق ، فإن أداءه أسوأ بكثير من الحركة .

Remove all occurrences:
    move 0.0048 ms
    indexof 0.0463 ms
    splice 0.0359 ms

Remove first occurrence:
    move_one 0.0041 ms
    indexof_one 0.0021 ms
amd picture
في ٢ مايو ٢٠١٤
88

يوفر هذا المسند بدلاً من القيمة.

ملاحظة: سيتم تحديث الصفيف المحدد ، وإرجاع الصفوف المتأثرة.

## الاستخدام

var removed = helper.removeOne(arr, row => row.id === 5 );

var removed = helper.remove(arr, row => row.name.startsWith('BMW'));

##تعريف

var helper = {
 // Remove and return the first occurrence

 removeOne: function(array, predicate) {
  for (var i = 0; i < array.length; i++) {
   if (predicate(array[i])) {
    return array.splice(i, 1);
   }
  }
 },

 // Remove and return all occurrences

 remove: function(array, predicate) {
  var removed = [];

  for (var i = 0; i < array.length; ) {
   if (predicate(array[i])) {
    removed.push(array.splice(i, 1));
    continue;
   }
   i++;
  }
  return removed;
 },
};
Salvador Dali picture
في ١٠ فبراير ٢٠١٤
82

يمكنك القيام بذلك بسهولة باستخدام طريقة التصفية :

function remove(arrOriginal, elementToRemove){
    return arrOriginal.filter(function(el){return el !== elementToRemove});
}
console.log(remove([1, 2, 1, 0, 3, 1, 4], 1));

يؤدي هذا إلى إزالة جميع العناصر من المصفوفة ويعمل أيضًا بشكل أسرع من توليفة من slice و indexOf .