it-swarm.asia

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

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

هل هناك طريقة بسيطة لإزالة عنصر محدد من صفيف؟ ما يعادل شيء مثل array.remove(number);.

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

7085
Walker

ابحث عن index من عنصر الصفيف الذي تريد إزالته ، ثم أزل هذا الفهرس بـ splice .

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

var array = [2, 5, 9];
console.log(array)
var index = array.indexOf(5);
if (index > -1) {
  array.splice(index, 1);
}
// array = [2, 9]
console.log(array);

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

10204
Tom Wadley

لا أعرف كيف تتوقع أن تتصرف 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];
1046
Peter Olson

تم التعديل في 2016 أكتوبر

  • هل لأنها بسيطة وبديهية وصريحة ( https://en.wikipedia.org/wiki/Occam٪27s_razor )
  • افعلها غير قابلة للتغيير (تبقى المجموعة الأصلية دون تغيير)
  • قم بذلك باستخدام وظائف JS القياسية ، إذا كان متصفحك لا يدعمها - استخدم polyfill

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

إزالة العنصر (رمز ECMA-262 الإصدار 5 الملقب بـ oldstyle JS)

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 ]

إزالة العنصر (رمز ES2015)

let value = 3

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

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

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

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


إزالة عناصر متعددة (رمز ES2016)

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

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 (...)" وظيفة غير مدعومة في IE على الإطلاق ، Chrome قبل الإصدار 47 ، Firefox قبل الإصدار 43 ، Safari قبل الإصدار 9 و Edge قبل الإصدار 14 حتى هنا هو polyfill من Mozilla

هل تريد إزالة عناصر متعددة (JavaScript المتطورة ES2018 JavaScript؟)

// 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 :)

المرجع

878
ujeenator

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

إذا كنت تريد فتحة فارغة ، فإن الحذف على ما يرام:

delete array[ index ];

إذا لم تقم بذلك ، يجب عليك استخدام لصق الطريقة:

array.splice( index, 1 );

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

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

في حالة رغبتك في القيام بذلك بترتيب ما ، يمكنك استخدام array.pop() لآخر واحد أو array.shift() لأول مرة (وكلاهما يعرض قيمة العنصر أيضًا).

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

394
xavierm02

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

إزالة كافة الحالات من صفيف

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

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

252
Ben Lesh

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

  1. splice () : anArray.splice(index, 1);

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

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

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

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

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

147
Sasa
Array.prototype.remByVal = 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].remByVal(3);
Array.prototype.remByVal = 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.remByVal('hello')

console.log(rooms)
121
Zirak

ليست هناك حاجة لاستخدام 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 هو حوالي 10x أبطأ من move . حتى إذا تم تحسينه عن طريق إزالة المكالمة إلى indexOf في لصق فهي تؤدي أسوأ بكثير من move .

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
89
slosd

قديم جدًا للرد ، ولكن قد يساعد ذلك شخصًا ما ، عن طريق توفير تقدير بدلاً من القيمة.

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

استعمال

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;
    }
};
60
amd

John Resig نشر تطبيقًا جيدًا :

// Array Remove - By John Resig (MIT Licensed)
Array.prototype.remove = function(from, to) {
  var rest = this.slice((to || from) + 1 || this.length);
  this.length = from < 0 ? this.length + from : from;
  return this.Push.apply(this, rest);
};

إذا كنت لا تريد تمديد كائن عمومي ، فيمكنك القيام بشيء مثل التالي ، بدلاً من ذلك:

// Array Remove - By John Resig (MIT Licensed)
Array.remove = function(array, from, to) {
    var rest = array.slice((to || from) + 1 || array.length);
    array.length = from < 0 ? array.length + from : from;
    return array.Push.apply(array, rest);
};

ولكن السبب الرئيسي في نشر هذا هو تحذير المستخدمين من التنفيذ البديل المقترح في التعليقات على تلك الصفحة (14 ديسمبر 2007):

Array.prototype.remove = function(from, to){
  this.splice(from, (to=[0,from||1,++to-from][arguments.length])<0?this.length+to:to);
  return this.length;
};

يبدو أنها تعمل بشكل جيد في البداية ، ولكن من خلال عملية مؤلمة اكتشفت أنها تفشل عند محاولة إزالة العنصر الثاني إلى الأخير في صفيف. على سبيل المثال ، إذا كان لديك صفيف مكون من 10 عناصر ومحاولة إزالة العنصر التاسع باستخدام هذا:

myArray.remove(8);

ينتهي بك الأمر مع مجموعة مكونة من 8 عناصر. لا أعرف لماذا لكنني أكدت أن تنفيذ John الأصلي لا يواجه هذه المشكلة.

57
Roger

Underscore.js يمكن استخدامها لحل المشاكل مع العديد من المتصفحات. يستخدم طرق متصفح داخلية إذا كانت موجودة. إذا كانت غائبة كما في حالة إصدارات Internet Explorer الأقدم ، فإنها تستخدم أساليبها المخصصة.

مثال بسيط لإزالة العناصر من الصفيف (من موقع الويب):

_.without([1, 2, 1, 0, 3, 1, 4], 0, 1); // => [2, 3, 4]
55
vatsal

يمكنك القيام بذلك بسهولة باستخدام filter method:

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

هذا يزيل جميع العناصر من المصفوفة ويعمل أيضًا بشكل أسرع ثم مزيج من الشرائح و indexOf

54
Salvador Dali

إذا كنت تريد إزالة صفيف جديد مع إزالة المواضع المحذوفة ، فيمكنك دائمًا حذف العنصر المحدد وتصفية الصفيف. قد يحتاج الأمر إلى امتداد لكائن array للمتصفحات التي لا تنفذ طريقة التصفية ولكن على المدى الطويل يكون الأمر أسهل: كل ما تفعله هو:

var my_array = [1,2,3,4,5,6];
delete my_array[4];
console.log(my_array.filter(function(a){return typeof a !== 'undefined';}));

يجب أن يعرض [1, 2, 3, 4, 6]

44
Loupax

يمكنك استخدام ES6.

var array=['1','2','3','4','5','6']
var index = array.filter((value)=>value!='3');

انتاج :

["1", "2", "4", "5", "6"]
38
rajat44

تحقق من هذا الرمز. وهو يعمل في كل المتصفح الرئيسي .

remove_item = function (arr, value) {
    var b = '';
    for (b in arr) {
        if (arr[b] === value) {
            arr.splice(b, 1);
            break;
        }
    }
    return arr;
}

استدعاء هذه الوظيفة

remove_item(array,value);
36
Ekramul Hoque

يمكنك استخدام lodash _.pull (mutate array) ، _.pullAt (mutate array) أو _.without (لا يقوم بتحويل الصفيف) ،

var array1 = ['a', 'b', 'c', 'd']
_.pull(array1, 'c')
console.log(array1) // ['a', 'b', 'd']

var array2 = ['e', 'f', 'g', 'h']
_.pullAt(array2, 0)
console.log(array2) // ['f', 'g', 'h']

var array3 = ['i', 'j', 'k', 'l']
var newArray = _.without(array3, 'i') // ['j', 'k', 'l']
console.log(array3) // ['i', 'j', 'k', 'l']
34
Chun Yang

حسنا ، على سبيل المثال كنت تواجه مجموعة أدناه:

var num = [1, 2, 3, 4, 5];

ونحن نريد حذف الرقم 4 ، يمكنك ببساطة القيام بالكود أدناه:

num.splice(num.indexOf(4), 1); //num will be [1, 2, 3, 5];

إذا قمت بإعادة استخدام هذه الوظيفة ، فأنت تكتب وظيفة قابلة لإعادة الاستخدام سيتم إرفاقها بوظيفة الصفيف الأصلي كما يلي:

Array.prototype.remove = Array.prototype.remove || function(x) {
  const i = this.indexOf(x);
  if(i===-1) return;
  this.splice(i, 1); //num.remove(5) === [1, 2, 3];
}

ولكن ماذا عن إذا كنت تواجه المجموعة أدناه بدلاً من ذلك مع وجود عدد قليل من [5] في مجموعة؟

var num = [5, 6, 5, 4, 5, 1, 5];

نحتاج إلى حلقة للتحقق منها جميعًا ، ولكن الطريقة الأسهل والأكثر كفاءة هي استخدام وظائف JavaScript المضمنة ، لذلك نكتب دالة تستخدم الفلتر كما يلي أدناه:

const _removeValue = (arr, x) => arr.filter(n => n!==x);
//_removeValue([1, 2, 3, 4, 5, 5, 6, 5], 5) //return [1, 2, 3, 4, 6]

هناك أيضًا مكتبات تابعة لجهات خارجية تساعدك في القيام بذلك ، مثل Lodash أو Underscore ، لمزيد من المعلومات ، انظر إلى lodash _.pull أو _.pullAt أو _.without.

32
Alireza

أنا جديد على JavaScript وأحتاج إلى هذه الوظيفة. لقد كتبت هذا فقط:

function removeFromArray(array, item, index) {
  while((index = array.indexOf(item)) > -1) {
    array.splice(index, 1);
  }
}

ثم عندما أرغب في استخدامه:

//Set-up some dummy data
var dummyObj = {name:"meow"};
var dummyArray = [dummyObj, "item1", "item1", "item2"];

//Remove the dummy data
removeFromArray(dummyArray, dummyObj);
removeFromArray(dummyArray, "item2");

الإخراج - كما هو متوقع. ["item1" ، "item1"]

قد يكون لديك احتياجات مختلفة عني ، لذلك يمكنك تعديلها بسهولة لتناسبها. آمل أن يكون هذا يساعد شخص ما.

27
sofiax

ES6 وبدون طفرة: (أكتوبر 2016)

const removeByIndex = (list, index) =>
  [
    ...list.slice(0, index),
    ...list.slice(index + 1)
  ];

ثم :

removeByIndex([33,22,11,44],1) //=> [33,11,44]
25
Abdennour TOUMI

التحديث: يوصى بهذه الطريقة فقط إذا لم تتمكن من استخدام ECMAScript 2015 (المعروف سابقًا باسم ES6). إذا كان بإمكانك استخدامه ، فإن الإجابات الأخرى هنا توفر الكثير من التطبيقات المتقنة.


هذا Gist هنا سوف يحل مشكلتك ، ويحذف أيضًا كل تكرارات الوسيطة بدلاً من 1 (أو قيمة محددة فقط).

Array.prototype.destroy = function(obj){
    // Return null if no objects were found and removed
    var destroyed = null;

    for(var i = 0; i < this.length; i++){

        // Use while-loop to find adjacent equal objects
        while(this[i] === obj){

            // Remove this[i] and store it within destroyed
            destroyed = this.splice(i, 1)[0];
        }
    }

    return destroyed;
}

الاستعمال:

var x = [1, 2, 3, 3, true, false, undefined, false];

x.destroy(3);         // => 3
x.destroy(false);     // => false
x;                    // => [1, 2, true, undefined]

x.destroy(true);      // => true
x.destroy(undefined); // => undefined
x;                    // => [1, 2]

x.destroy(3);         // => null
x;                    // => [1, 2]
23
zykadelic

إذا كان لديك كائنات معقدة في مجموعة يمكنك استخدام المرشحات؟ في الحالات التي يكون فيها $ .inArray أو array.splice ليس سهل الاستخدام. خاصة إذا كانت الكائنات ربما ضحلة في الصفيف.

مثلا إذا كان لديك كائن به حقل معرف وتريد إزالته من صفيف:

this.array = this.array.filter(function(element, i) {
    return element.id !== idToRemove;
});
22
flurdy

أريد الإجابة على أساسES6. افترض ، لديك مجموعة مثل أدناه:

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

إذا كنت تريد حذف فهرس خاص مثل 2 ، فاكتب الكود أدناه:

arr.splice(2, 1); //=> arr became [1,2,4]

ولكن إذا كنت تريد حذف عنصر خاص مثل 3 ولا تعرف فهرسته ، فستحب ما يلي:

arr = arr.filter(e => e !== 3); //=> arr became [1,2,4]

تلميح : يرجى استخدام وظيفة السهم لإعادة الاتصال مرشح إلا إذا كنت سوف تحصل على مجموعة فارغة.

20
AmerllicA

يجب ألا تحور صفيفك أبدًا. لأن هذا ضد نمط البرمجة الوظيفية. ما يمكنك القيام به هو إنشاء صفيف جديد دون الرجوع إلى الصفيف الذي تريد تغيير بيانات استخدام طريقة es6 filter فيه ؛

var myArray = [1,2,3,4,5,6];

افترض أنك تريد إزالة 5 من الصفيف يمكنك ببساطة القيام بذلك مثل هذا.

myArray = myArray.filter(value => value !== 5);

سيعطيك هذا صفيفًا جديدًا دون القيمة التي تريد إزالتها. وبالتالي فإن النتيجة ستكون

 [1,2,3,4,6]; // 5 has been removed from this array

لمزيد من الفهم ، يمكنك قراءة وثائق MDN على Array.filter https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

19
Adeel Imran

نهج أكثر حداثة ، ECMAScript 2015 (المعروف سابقًا باسم Harmony أو ES 6). معطى:

const items = [1, 2, 3, 4];
const index = 2;

ثم:

items.filter((x, i) => i !== index);

العائد:

[1, 2, 4]

يمكنك استخدام Babel و خدمة polyfill لضمان دعمها بشكل جيد عبر المتصفحات.

18
bjfletcher

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

وظيفة قائمة بذاتها

function removeAll(array, key){
    var index = array.indexOf(key);

    if(index === -1) return;

    array.splice(index, 1);
    removeAll(array,key);
}

طريقة النموذج الأولي

Array.prototype.removeAll = function(key){
    var index = this.indexOf(key);

    if(index === -1) return;

    this.splice(index, 1);
    this.removeAll(key);
}
16
wharding28

لدي حل جيد آخر لإزالة من مجموعة:

var words = ['spray', 'limit', 'Elite', 'exuberant', 'destruction', 'present'];

const result = words.filter(Word => Word.length > 6);

console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

15
Aram Grigoryan

يمكنك القيام بحلقة للخلف للتأكد من عدم تثبيت الفهارس ، في حالة وجود مثيلات متعددة للعنصر.

var myElement = "chocolate";
var myArray = ['chocolate', 'poptart', 'poptart', 'poptart', 'chocolate', 'poptart', 'poptart', 'chocolate'];

/* Important code */
for (var i = myArray.length - 1; i >= 0; i--) {
    if (myArray[i] == myElement) myArray.splice(i, 1);
}

عرض حي

15
Jeff Noel

بناءً على جميع الإجابات التي كانت صحيحة بشكل أساسي مع مراعاة أفضل الممارسات المقترحة (خاصةً عدم استخدام Array.prototype مباشرة) ، توصلت إلى الرمز التالي:

function arrayWithout(arr, values) {
  var isArray = function(canBeArray) {
    if (Array.isArray) {
      return Array.isArray(canBeArray);
    }
    return Object.prototype.toString.call(canBeArray) === '[object Array]';
  };

  var excludedValues = (isArray(values)) ? values : [].slice.call(arguments, 1);
  var arrCopy = arr.slice(0);

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

  return arrCopy;
}

عند مراجعة الوظيفة أعلاه ، على الرغم من أنها تعمل بشكل جيد ، أدركت أنه قد يكون هناك بعض التحسن في الأداء. يعد استخدام ES6 بدلاً من ES5 طريقة أفضل بكثير. تحقيقًا لهذه الغاية ، هذا هو الرمز المحسن:

const arrayWithoutFastest = (() => {
  const isArray = canBeArray => ('isArray' in Array) 
    ? Array.isArray(canBeArray) 
    : Object.prototype.toString.call(canBeArray) === '[object Array]';

  let mapIncludes = (map, key) => map.has(key);
  let objectIncludes = (obj, key) => key in obj;
  let includes;

  function arrayWithoutFastest(arr, ...thisArgs) {
    let withoutValues = isArray(thisArgs[0]) ? thisArgs[0] : thisArgs;

    if (typeof Map !== 'undefined') {
      withoutValues = withoutValues.reduce((map, value) => map.set(value, value), new Map());
      includes = mapIncludes;
    } else {
      withoutValues = withoutValues.reduce((map, value) => { map[value] = value; return map; } , {}); 
      includes = objectIncludes;
    }

    const arrCopy = [];
    const length = arr.length;

    for (let i = 0; i < length; i++) {
      // If value is not in exclude list
      if (!includes(withoutValues, arr[i])) {
        arrCopy.Push(arr[i]);
      }
    }

    return arrCopy;
  }

  return arrayWithoutFastest;  
})();

كيف تستعمل:

const arr = [1,2,3,4,5,"name", false];

arrayWithoutFastest(arr, 1); // will return array [2,3,4,5,"name", false]
arrayWithoutFastest(arr, 'name'); // will return [2,3,4,5, false]
arrayWithoutFastest(arr, false); // will return [2,3,4,5]
arrayWithoutFastest(arr,[1,2]); // will return [3,4,5,"name", false];
arrayWithoutFastest(arr, {bar: "foo"}); // will return the same array (new copy)

أقوم حاليًا بكتابة منشور في المدونة قمت فيه بتقييم عدة حلول لـ Array دون مشكلة ومقارنة الوقت المستغرق لتشغيله. سوف أقوم بتحديث هذه الإجابة بالرابط بمجرد الانتهاء من هذا المنشور. فقط لإعلامك ، لقد قارنت ما ورد أعلاه بـ lodash بدون وفي حال كان المستعرض يدعم Map ، فإنه يفوق lodash! لاحظ أنني لا أستخدم Array.prototype.indexOf أو Array.prototype.includes كالتفاف في exlcudeValues ​​في Map أو Object يجعل الاستعلام أسرع!

15
Ardi
  Array.prototype.removeItem = function(a) {
            for (i = 0; i < this.length; i++) {
                if (this[i] == a) {
                    for (i2 = i; i2 < this.length - 1; i2++) {
                        this[i2] = this[i2 + 1];
                    }
                    this.length = this.length - 1
                    return;
                }
            }
        }

    var recentMovies = ['Iron Man', 'Batman', 'Superman', 'Spiderman'];
    recentMovies.removeItem('Superman');
14
Don Vincent Preziosi

لديك 1 إلى 9 مجموعة وتريد إزالة 5 استخدام أدناه رمز.

var numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];

var newNumberArray = numberArray.filter(m => {
  return m !== 5;
});

console.log("new Array, 5 removed", newNumberArray);

إذا كنت ترغب في قيمة متعددة السابقين: - 1،7،8

var numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];

var newNumberArray = numberArray.filter(m => {
  return (m !== 1) && (m !== 7) && (m !== 8);
});

console.log("new Array, 5 removed", newNumberArray);

إذا كنت ترغب في إزالة قيمة الصفيف في الصفيف السابقين: - [3،4،5]

var numberArray = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var removebleArray = [3,4,5];

var newNumberArray = numberArray.filter(m => {
    return !removebleArray.includes(m);
});

console.log("new Array, [3,4,5] removed", newNumberArray);

يشمل المتصفح المدعوم هو link

14
Thilina Sampath

حذف حسب الفهرس

تعمل على إرجاع نسخة من الصفيف بدون العنصر في الفهرس.

/**
* removeByIndex
* @param {Array} array
* @param {Number} index
*/
function removeByIndex(array, index){
    return array.filter(function(elem, _index){
        return index != _index;
    });
}
l = [1,3,4,5,6,7];
console.log(removeByIndex(l, 1));

$> [ 1, 4, 5, 6, 7 ]

حذف حسب القيمة

تعمل على إرجاع نسخة من الصفيف بدون القيمة.

/**
* removeByValue
* @param {Array} array
* @param {Number} value
*/
function removeByValue(array, value){
    return array.filter(function(elem, _index){
        return value != elem;
    });
}
l = [1,3,4,5,6,7];
console.log(removeByValue(l, 5));

$> [ 1, 3, 4, 6, 7]
13
nsantana

إنشاء مجموعة جديدة:

var my_array = new Array();

إضافة عناصر إلى هذه المجموعة:

my_array.Push("element1");

الدالة indexOf (إرجاع مؤشر أو -1 عند عدم العثور على):

var indexOf = function(needle) 
{
    if(typeof Array.prototype.indexOf === 'function') // newer browsers
    {
        indexOf = Array.prototype.indexOf;
    } 
    else // older browsers
    {
        indexOf = function(needle) 
        {
            var index = -1;

            for(var i = 0; i < this.length; i++) 
            {
                if(this[i] === needle) 
                {
                    index = i;
                    break;
                }
            }
            return index;
        };
    }

    return indexOf.call(this, needle);
};

التحقق من مؤشر هذا العنصر (تم اختباره باستخدام فايرفوكس و IE8 +):

var index = indexOf.call(my_array, "element1");

إزالة عنصر واحد موجود في الفهرس من الصفيف

my_array.splice(index, 1);
11
Enrico

ركضت أيضًا في الموقف حيث اضطررت إلى إزالة عنصر من Array. .indexOf لم يكن يعمل في IE* لذا شارك حل jQuery.inArray() الخاص بي في العمل.

var index = jQuery.inArray(val,arr);
if (index > -1) {
    arr.splice(index, 1);
    //console.log(arr);
}
10
NullPointer

2017-05-08

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

const a = {'field': 2} // Non-primitive object
const b = {'field': 2} // Non-primitive object with same value
const c = a            // Non-primitive object that reference the same object as "a"

assert(a !== b) // Don't reference the same item, but have same value
assert(a === c) // Do reference the same item, and have same value (naturally)

//Note: there are many alternative implementations for valuesAreEqual
function valuesAreEqual (x, y) {
   return  JSON.stringify(x) === JSON.stringify(y)
}


//filter will delete false values
//Thus, we want to return "false" if the item
// we want to delete is equal to the item in the array
function removeFromArray(arr, toDelete){
    return arr.filter(target => {return !valuesAreEqual(toDelete, target)})
}

const exampleArray = [a, b, b, c, a, {'field': 2}, {'field': 90}];
const resultArray = removeFromArray(exampleArray, a);

//resultArray = [{'field':90}]

هناك تطبيقات بديلة/أسرع للقيم AreEqual ، لكن هذا يؤدي المهمة. يمكنك أيضًا استخدام مقارنة مخصصة إذا كان لديك حقل محدد للتحقق منه (على سبيل المثال ، تم استرداد بعض UUID مقابل UUID محلي).

لاحظ أيضًا أن هذه عملية عملية ، مما يعني أنها لا تؤدي إلى تغيير الصفيف الأصلي.

9
Aidan Hoolachan

أعتقد أن العديد من تعليمات JavaScript ليست مدروسة جيدًا للبرمجة الوظيفية. إرجاع Splice العنصر المحذوف حيث تحتاج في معظم الوقت إلى الصفيف المخفض. هذا سيء.

تخيل أنك تجري مكالمة متكررة وتحتاج إلى تمرير صفيف يحتوي على عنصر واحد أقل ، ربما بدون العنصر المفهرس الحالي. أو تخيل أنك تقوم بإجراء مكالمة عودية أخرى ويجب أن تمرر صفيفًا مع عنصر تم ضغطه.

في أي من هذه الحالات ، يمكنك القيام بـ myRecursiveFunction(myArr.Push(c)) أو myRecursiveFunction(myArr.splice(i,1)). في الحقيقة ، سوف يمر أحمق الأول بطول المصفوفة ، وسيقوم الأحمق الثاني بتمرير العنصر المحذوف كمعلمة.

إذاً ما أقوم به في الواقع ... لحذف عنصر صفيف وتمرير النتيجة إلى دالة كمعلمة في نفس الوقت أفعل كما يلي

myRecursiveFunction(myArr.slice(0,i).concat(a.slice(i+1)))

عندما يتعلق الأمر بالدفع ، هذا أكثر سخيفة ... أنا أحب ،

myRecursiveFunction((myArr.Push(c),myArr))

أنا أؤمن بلغة وظيفية مناسبة أن طريقة تحوير الكائن الذي يتم استدعاؤه يجب أن تُرجع إشارة إلى الكائن نفسه نتيجة لذلك.

9
Redu

في CoffeeScript :

my_array.splice(idx, 1) for ele, idx in my_array when ele is this_value
8
Nigel Sheridan-Smith

استخدم InArray jQuery:

A = [1, 2, 3, 4, 5, 6];
A.splice($.inArray(3, A), 1);
//It will return A=[1, 2, 4, 5, 6]`   

ملاحظة: inArray سيعود -1 ، إذا لم يتم العثور على العنصر.

7
Do Hoa Vinh

يمكن إجراء إزالة عنصر/سلسلة معينة من صفيف في بطانة واحدة: ما زلت أعتقد أن هذا هو الخطوط الأكثر أناقة التي يمكنك الحصول عليها لهذا النوع من المشاكل:

theArray.splice(theArray.indexOf("stringToRemoveFromArray"), 1);

حيث "theArray" هو الصفيف الذي تريد إزالة شيء خاص منه ، و 1 هو مقدار العناصر التي تريد إزالتها.

7
Max Alexander Hanna

Vanilla JavaScript (ES5.1) - in place edition

دعم المستعرض: Internet Explorer 9 أو أحدث ( دعم مفصل للمستعرض )

/**
 * Removes all occurences of the item from the array.
 *
 * Modifies the array “in place”, i.e. the array passed as an argument
 * is modified as opposed to creating a new array. Also returns the modified
 * array for your convenience.
 */
function removeInPlace(array, item) {
    var foundIndex, fromIndex;

    // Look for the item (the item can have multiple indices)
    fromIndex = array.length - 1;
    foundIndex = array.lastIndexOf(item, fromIndex);

    while (foundIndex !== -1) {
        // Remove the item (in place)
        array.splice(foundIndex, 1);

        // Bookkeeping
        fromIndex = foundIndex - 1;
        foundIndex = array.lastIndexOf(item, fromIndex);
    }

    // Return the modified array
    return array;
}

Vanilla JavaScript (ES5.1) - غير قابل للتغيير edition

دعم المتصفح: مثل Vanilla JavaScript in place edition

/**
 * Removes all occurences of the item from the array.
 *
 * Returns a new array with all the items of the original array except
 * the specified item.
 */
function remove(array, item) {
    var arrayCopy;

    arrayCopy = array.slice();

    return removeInPlace(arrayCopy, item);
}

الفانيليا ES6 - غير قابل للتغيير الطبعة

دعم المتصفح: Chrome 46 ، Edge 12 ، Firefox 16 ، Opera 37 ، Safari 8 ( دعم مفصل للمتصفح )

/**
 * Removes all occurences of the item from the array.
 *
 * Returns a new array with all the items of the original array except
 * the specified item.
 */
function remove(array, item) {
    // Copy the array
    array = [...array];

    // Look for the item (the item can have multiple indices)
    let fromIndex = array.length - 1;
    let foundIndex = array.lastIndexOf(item, fromIndex);

    while (foundIndex !== -1) {
        // Remove the item by generating a new array without it
        array = [
            ...array.slice(0, foundIndex),
            ...array.slice(foundIndex + 1),
        ];

        // Bookkeeping
        fromIndex = foundIndex - 1;
        foundIndex = array.lastIndexOf(item, fromIndex)
    }

    // Return the new array
    return array;
}
6
Lars Gyrup Brink Nielsen

قم بإزالة العنصر في الفهرس i ، دون تغيير الصفيف الأصلي:

/**
* removeElement
* @param {Array} array
* @param {Number} index
*/
function removeElement(array, index) {
   return Array.from(array).splice(index, 1);
}

// Another way is
function removeElement(array, index) {
   return array.slice(0).splice(index, 1);
}
6
alejandro

يعجبني هذا الإصدار من splice ، مع إزالة عنصر من خلال قيمته باستخدام $.inArray:

$(document).ready(function(){
    var arr = ["C#","Ruby","PHP","C","C++"];
    var itemtoRemove = "PHP";
    arr.splice($.inArray(itemtoRemove, arr),1);
});
6
mboeckle

يمكنك التكرار على كل عنصر array- و splice إذا كان موجودًا في array.

function destroy(arr, val) {
    for (var i = 0; i < arr.length; i++) if (arr[i] === val) arr.splice(i, 1);
    return arr;
}
6
yckart

لقد قمت للتو بإنشاء ملف polyfill على Array.prototype عبر Object.defineProperty لإزالة العنصر المطلوب في صفيف دون أن يؤدي إلى حدوث أخطاء عند التكرار فوقه لاحقًا عبر for .. in ..

if (!Array.prototype.remove) {
  // Object.definedProperty is used here to avoid problems when iterating with "for .. in .." in Arrays
  // https://stackoverflow.com/questions/948358/adding-custom-functions-into-array-prototype
  Object.defineProperty(Array.prototype, 'remove', {
    value: function () {
      if (this == null) {
        throw new TypeError('Array.prototype.remove called on null or undefined')
      }

      for (var i = 0; i < arguments.length; i++) {
        if (typeof arguments[i] === 'object') {
          if (Object.keys(arguments[i]).length > 1) {
            throw new Error('This method does not support more than one key:value pair per object on the arguments')
          }
          var keyToCompare = Object.keys(arguments[i])[0]

          for (var j = 0; j < this.length; j++) {
            if (this[j][keyToCompare] === arguments[i][keyToCompare]) {
              this.splice(j, 1)
              break
            }
          }
        } else {
          var index = this.indexOf(arguments[i])
          if (index !== -1) {
            this.splice(index, 1)
          }
        }
      }
      return this
    }
  })
} else {
  var errorMessage = 'DANGER ALERT! Array.prototype.remove has already been defined on this browser. '
  errorMessage += 'This may lead to unwanted results when remove() is executed.'
  console.log(errorMessage)
}

إزالة قيمة عدد صحيح

var a = [1, 2, 3]
a.remove(2)
a // Output => [1, 3]

إزالة قيمة السلسلة

var a = ['a', 'ab', 'abc']
a.remove('abc')
a // Output => ['a', 'ab']

إزالة قيمة منطقية

var a = [true, false, true]
a.remove(false)
a // Output => [true, true]

من الممكن أيضًا إزالة كائن داخل الصفيف عبر طريقة Array.prototype.remove. تحتاج فقط إلى تحديد key => value الخاص بـ Object الذي تريد إزالته.

إزالة قيمة كائن

var a = [{a: 1, b: 2}, {a: 2, b: 2}, {a: 3, b: 2}]
a.remove({a: 1})
a // Output => [{a: 2, b: 2}, {a: 3, b: 2}]
5
Victor

قمت بعمل امتداد فعال إلى حد ما إلى مجموعة JavaScript الأساسية:

Array.prototype.drop = function(k) {
  var valueIndex = this.indexOf(k);
  while(valueIndex > -1) {
    this.removeAt(valueIndex);
    valueIndex = this.indexOf(k);
  }
};
5
Shawn Deprey

بحلتي ، يمكنك إزالة عنصر أو أكثر من عنصر واحد في صفيف بفضل جافا سكريبت الخالص. ليست هناك حاجة لمكتبة جافا سكريبت أخرى.

var myArray = [1,2,3,4,5]; // First array

var removeItem = function(array,value) {  // My clear function
    if(Array.isArray(value)) {  // For multi remove
        for(var i = array.length - 1; i >= 0; i--) {
            for(var j = value.length - 1; j >= 0; j--) {
                if(array[i] === value[j]) {
                    array.splice(i, 1);
                };
            }
        }
    }
    else { // For single remove
        for(var i = array.length - 1; i >= 0; i--) {
            if(array[i] === value) {
                array.splice(i, 1);
            }
        }
    }
}

removeItem(myArray,[1,4]); // myArray will be [2,3,5]
5
Kamuran Sönecek

قم بإزالة قيمة واحدة ، باستخدام مقارنة فضفاضة ، دون تغيير الصفيف الأصلي ، ES6

/**
 * Removes one instance of `value` from `array`, without mutating the original array. Uses loose comparison.
 * 
 * @param {Array} array Array to remove value from
 * @param {*} value Value to remove
 * @returns {Array} Array with `value` removed
 */
export function arrayRemove(array, value) {
    for(let i=0; i<array.length; ++i) {
        if(array[i] == value) {
            let copy = [...array];
            copy.splice(i, 1);
            return copy;
        }
    }
    return array;
}
4
mpen

إجابة أخرى ، بالنسبة لي ، كلما كانت أبسط هي الأفضل ، وكما نحن في عام 2018 (بالقرب من عام 2019) ، أعطيك هذا (القريب) بطانة واحدة للإجابة على السؤال الأصلي:

Array.prototype.remove = function (value) { 
    return this.filter(f => f != value) 
}

الشيء المفيد هو أنه يمكنك استخدامه في تعبير الكاري مثل:

[1,2,3].remove(2).sort()

4
Sebastien H.

في حين أن معظم الإجابات الواردة أعلاه تجيب على السؤال ، فإنه ليس من الواضح بما فيه الكفاية لماذا لم يتم استخدام طريقة slice(). نعم ، filter() تفي بمعايير الثبات ، ولكن ماذا عن عمل المكافئ الأقصر التالي:

const myArray = [1,2,3,4];

والآن لنفترض أنه يجب علينا إزالة العنصر الثاني من الصفيف ، يمكننا ببساطة القيام بما يلي: const newArray = myArray.slice(0,1).concat(myArray.slice(2,4));// [1,3,4]

يتم تشجيع هذه الطريقة في حذف عنصر من مجموعة بشدة اليوم في المجتمع بسبب طبيعته البسيطة وغير القابلة للتغيير. بشكل عام ، يجب تجنب الطرق التي تسبب طفرة. على سبيل المثال ، يُنصح باستبدال Push() بـ concat() و splice() بـ slice()

4
Stelios Voskos

استخدم jQuery.grep () :

var y = [1, 2, 3, 9, 4]
var removeItem = 9;

y = jQuery.grep(y, function(value) {
  return value != removeItem;
});
console.log(y)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script>
4
Mahendra Kulkarni

انشر الكود الذي يزيل عنصر المصفوفة في مكانه ، ويقلل من طول المصفوفة أيضًا.

function removeElement(idx, arr) {
    // check the index value
    if (idx < 0 || idx >= arr.length) {
        return;
    }
    // shift the elements
    for (var i = idx; i > 0; --i) {
        arr[i] = arr[i - 1];
    }
    // remove the first element in array
    arr.shift();
}
3
hailong
var array = [2, 5, 9];
array.splice(array.findIndex(x => x==5), 1);

باستخدام Array.findindex ، يمكننا تقليل عدد أسطر التعليمات البرمجية.

developer.mozilla.org

3
sujithklr93

هناك العديد من الإجابات الرائعة هنا ، ولكن بالنسبة لي ، ما نجح ببساطة هو عدم إزالة العنصر الخاص بي من الصفيف تمامًا ولكن ببساطة تعيين القيمة على القيمة. يعمل هذا في معظم الحالات التي أمتلكها ، وهو حل جيد لأنني سأستخدم المتغير لاحقًا ولا أريد أن أذهب ، فارغ فقط في الوقت الحالي. أيضا ، هذا النهج متوافق تماما عبر المستعرض.

array.key = null;
3
rncrtr

إزالة التكرار الأخير أو كل الأحداث ، أو التكرار الأول؟

var array = [2, 5, 9, 5];

// Remove last occurrence (or all occurrences)
for (var i = array.length; i--;) {
  if (array[i] === 5) {
     array.splice(i, 1);
     break; // Remove this line to remove all occurrences
  }
}

أو

var array = [2, 5, 9, 5];

// Remove first occurrence
for (var i = 0; array.length; i++) {
  if (array[i] === 5) {
     array.splice(i, 1);
     break; // Do not remove this line
  }
}
3
MEC

لم يوضح سؤالك ما إذا كانت قيم الطلب أو القيم المميزة مطلوبة أم لا.

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

var aSet = new Set();

aSet.add(1);
aSet.add(2);
aSet.add(3);

aSet.delete(2);
3
Steven Spungin

لكل من يتطلع إلى تكرار طريقة من شأنها أن تُرجع صفيفًا جديدًا يحتوي على أرقام أو سلاسل مكررة تمت إزالتها ، فقد تم تجميع ذلك من الإجابات الحالية:

function uniq(array) {
  var len = array.length;
  var dupFree = [];
  var tempObj = {};

  for (var i = 0; i < len; i++) {
    tempObj[array[i]] = 0;
  }

  console.log(tempObj);

  for (var i in tempObj) {
    var element = i;
    if (i.match(/\d/)) {
      element = Number(i);
    }
    dupFree.Push(element);
  }

  return dupFree;
}
3
cjjenkinson

أنا جعلت وظيفة

function pop(valuetoremove, myarray) {
var indexofmyvalue = myarray.indexOf(valuetoremove);
myarray.splice(indexofmyvalue, 1);
}

وتستخدم مثل هذا.

pop(valuetoremove,myarray);

في صحتك!

3
Ali Akram

سيكون التنفيذ الساذج للغاية كما يلي:

Array.prototype.remove = function(data) {
    const dataIdx = this.indexOf(data)
    if(dataIdx >= 0) {
        this.splice(dataIdx ,1);
    }
    return this.length;
}

let a = [1,2,3];
// this will change arr a to [1, 3]
a.remove(2);

أعود إلى طول الصفيف من الوظيفة للامتثال للأساليب الأخرى مثل Array.prototype.Push().

3
Gaurang Patel

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

بناء الجملة: array.splice (الفهرس ، deleteCount ، item1 ، ..... ، itemX)}

هنا index إلزامي ووسائط الراحة اختيارية.

فمثلا:

let arr = [1, 2, 3, 4, 5, 6];
arr.splice(2,1);
console.log(arr);
// [1, 2, 4, 5, 6]

ملاحظة: Array.splice () طريقة يمكن استخدامها إذا كنت تعرف فهرس العنصر الذي تريد حذفه. ولكن قد يكون لدينا عدد قليل من الحالات كما هو مذكور أدناه

  1. في حال كنت تريد حذف العنصر الأخير فقط ، يمكنك استخدام Array.pop ()

  2. في حال كنت تريد حذف العنصر الأول فقط ، يمكنك استخدام Array.shift ()

  3. إذا كنت تعرف العنصر بمفرده ولكن ليس موضع (أو فهرس) العنصر ، وتريد حذف جميع العناصر المطابقة باستخدام Array.filter () الطريقة:

    let arr = [1, 2, 1, 3, 4, 1, 5, 1];
    
    let newArr = arr.filter(function(val){
        return val !== 1;
     });
     //newArr => [2, 3, 4, 5]
    

أو باستخدام طريقة لصق ()

let arr = [1, 11, 2, 11, 3, 4, 5, 11, 6, 11];
    for( let i = 0; i < arr.length-1; i++){
       if ( arr[i] === 11) {
         arr.splice(i, 1); 
       }
    }
    console.log(arr);
    // [1, 2, 3, 4, 5, 6]

أو لنفترض أننا نريد حذف del من Array arr:

let arr = [1, 2, 3, 4, 5, 6];
let del = 4;
if(arr.indexOf(4) >= 0) {
arr.splice(arr.indexOf(4), 1)
}

OR

let del = 4;
for(var i = arr.length - 1; i >= 0; i--) {
    if(arr[i] === del) {
       arr.splice(i, 1);
    }
}
  1. إذا كنت تعرف العنصر بمفرده ولكن ليس موضع (أو فهرس) العنصر ، وتريد حذف عنصر المطابقة الأول فقط باستخدام طريقة splice ():

    let arr = [1, 11, 2, 11, 3, 4, 5, 11, 6, 11];
    
    for( let i = 0; i < arr.length-1; i++){
      if ( arr[i] === 11) {
        arr.splice(i, 1);
        break;
      }
    }
    console.log(arr);
    // [1, 11, 2, 11, 3, 4, 5, 11, 6, 11]
    
2
Chang

واجهت هذه المشكلة بنفسي (في موقف كان فيه استبدال المصفوفة مقبولًا) وحلها بطريقة بسيطة:

var filteredItems = this.items.filter(function (i) {
    return i !== item;
});

لإعطاء المقتطف أعلاه القليل من السياق:

self.thingWithItems = {
        items: [],
        removeItem: function (item) {
            var filteredItems = this.items.filter(function (i) {
                return i !== item;
            });

            this.items = filteredItems;
        }
    };

يجب أن يعمل هذا الحل مع كل من العناصر المرجعية والقيمة. كل هذا يتوقف على ما إذا كنت بحاجة إلى الاحتفاظ بمرجع للصفيف الأصلي لمعرفة ما إذا كان هذا الحل قابلاً للتطبيق أم لا.

2
Phil
var index,
    input = [1,2,3],
    indexToRemove = 1;
    integers = [];

for (index in input) {
    if (input.hasOwnProperty(index)) {
        if (index !== indexToRemove) {
            integers.Push(result); 
        }
    }
}
input = integers;

سيستغرق هذا الحل مجموعة من المدخلات وسيبحث من خلال الإدخال عن القيمة المراد إزالتها. سيتم تنفيذ حلقة من خلال صفيف الإدخال بالكامل وستكون النتيجة عددًا صحيحًا للصفيف الثاني تمت إزالة الفهرس المحدد. ثم يتم نسخ صفيف الأعداد الصحيحة مرة أخرى في صفيف الإدخال.

2
penguin
[2,3,5].filter(i => ![5].includes(i))
2
Atchutha rama reddy Karri

إزالة القيمة مع مؤشر ولصق!

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

حذف عنصر من الماضي

arrName.pop();

حذف عنصر من الأول

arrName.shift();

حذف من الوسط

arrName.splice(starting index,number of element you wnt to delete);

Ex: arrName.splice(1,1);

حذف عنصر واحد من الماضي

arrName.splice(-1);

حذف باستخدام رقم فهرس الصفيف

 delete arrName[1];
2
Srikrushna Pal

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

لقد بحثت في الكثير من هذه الإجابات ويبدو أنهم جميعًا يستخدمون "القوة الغاشمة" بقدر ما أستطيع رؤيته. لم أختبر كل واحد ، أعتذر إذا لم يكن الأمر كذلك. هذا أمر جيد بالنسبة لمجموعة صغيرة ، ولكن ماذا لو كان لديك آلاف الأعداد الصحيحة في ذلك؟

صححني إذا كنت مخطئًا ، لكن لا يمكننا أن نفترض أنه في خريطة key => value ، من النوع الذي يوجد به كائن JS ، يمكن افتراض أن آلية استرجاع المفاتيح مصممة ومُحسّنة للغاية؟ (ملحوظة: إذا أخبرني بعض الخبراء الخارقين أن هذا ليس هو الحال ، يمكنني أن أقترح استخدام فئة ES6's Map بدلاً من ذلك ، والتي ستكون بالتأكيد).

أقترح فقط ، في ظروف معينة ، أن الحل الأفضل قد يكون تحويل الصفيف الخاص بك إلى كائن ... المشكلة ، بالطبع ، أنه قد يكون لديك تكرار قيم عدد صحيح. أقترح وضع هؤلاء في مجموعات كجزء "القيمة" من إدخالات key => value. (ملاحظة: إذا كنت متأكدًا من عدم وجود عناصر صفيف متكررة ، فقد يكون ذلك أبسط من ذلك بكثير: قيم "نفس" المفاتيح ، ثم انتقل إلى Object.values(...) لاستعادة صفيفك المعدل).

لذلك يمكنك أن تفعل:

const arr = [ 1, 2, 55, 3, 2, 4, 55 ];
const f =   function( acc, val, currIndex ){ 
    // not seen this val before: make bucket... NB although val's typeof is 'number'
    // there is seamless equivalence between the object key (always string)
    // and this variable val 
    ! ( val in acc ) ? acc[ val ] = []: 0;
    // drop another array index in the bucket
    acc[ val ].Push( currIndex );
    return acc; 
}
const myIntsMapObj = arr.reduce( f, {});

console.log( myIntsMapObj );

انتاج:

كائن [<1 فتحة فارغة> ، Array 1 ، Array [2] ، Array 1 ، Array 1 ، <5 فتحات فارغة> ، 46 أكثر ...]

من السهل بعد ذلك حذف جميع الأرقام 55

delete myIntsMapObj[ 55 ]; // again, although keys are strings this works

ليس عليك حذفها جميعًا: يتم دفع قيم الفهرس إلى مجموعاتها بترتيب المظهر ، لذا (على سبيل المثال):

myIntsMapObj[ 55 ].shift(); // and
myIntsMapObj[ 55 ].pop(); 

سيحذف التكرار الأول والأخير على التوالي. يمكنك حساب تواتر حدوثه بسهولة ، واستبدال كل 55s بـ 3 ثوان عن طريق نقل محتويات دلو إلى آخر ، إلخ.

... استرجع صفيف int المعدل الخاص بك بشكل بسيط: لكن كل مجموعة تحتوي على فهرس (في الصفيف الأصلي) للقيمة التي يمثلها المفتاح (string). تعد كل مجموعة من هذه القيم فريدة أيضًا: لذا يمكنك تحويلها إلى مفاتيح في كائن جديد ، مع وجود عدد صحيح (حقيقي) من "مفتاح سلسلة صحيح" كقيمة ... ثم فرز المفاتيح وانتقل إلى Object.values( ... ).

هذا يبدو متورطًا للغاية ويستغرق وقتًا طويلًا ... ولكن من الواضح أن كل شيء يعتمد على الظروف والاستخدام المطلوب. أفهم أن جميع إصدارات وسياقات JS تعمل فقط في مؤشر ترابط واحد ، وأن السلسلة لا "تترك" ، لذلك يمكن أن يكون هناك بعض الازدحام الرهيب باستخدام طريقة "القوة الغاشمة": لا تسببها عمليات indexOf ops ، ولكن تكرار slice/splice ops.

إضافة
إذا كنت متأكد فهذه هندسة كثيرة للغاية لحالة الاستخدام الخاصة بك بالتأكيد فإن أبسط طريقة "القوة الغاشمة" هي

const arr = [ 1, 2, 3, 66, 8, 2, 3, 2 ];
const newArray = arr.filter( number => number !== 3 );
console.log( newArray )

(نعم ، رصدت إجابات أخرى Array.prototype.filter...)

2
mike rodent

ستقوم الطريقة التالية بإزالة كافة إدخالات قيمة معينة من صفيف دون إنشاء صفيف جديد وبتكرار واحد فقط وهو superfast . ويعمل في المتصفح القديم Internet Explorer 5.5 :

function removeFromArray(arr, removeValue) {
  for (var i = 0, k = 0, len = arr.length >>> 0; i < len; i++) {
    if (k > 0)
      arr[i - k] = arr[i];

    if (arr[i] === removeValue)
      k++;
  }

  for (; k--;)
    arr.pop();
}

var a = [0, 1, 0, 2, 0, 3];

document.getElementById('code').innerHTML =
  'Initial array [' + a.join(', ') + ']';
//Initial array [0, 1, 0, 2, 0, 3]

removeFromArray(a, 0);

document.getElementById('code').innerHTML +=
  '<br>Resulting array [' + a.join(', ') + ']';
//Resulting array [1, 2, 3]
<code id="code"></code>
2
Eugene Tiurin

إذا كان يجب عليك دعم الإصدارات القديمة من Internet Explorer ، فإنني أوصي باستخدام polyfill التالي (ملاحظة: هذا هو لا إطار عمل). إنه بديل متوافق بنسبة 100٪ لجميع أساليب المصفوفات الحديثة (JavaScript 1.8.5/ECMAScript 5 Array Extras) التي تعمل مع Internet Explorer 6+ و Firefox 1.5+ و Chrome و Safari و Opera.

https://github.com/plusdude/array-generics

1
Matt Brock

غالبًا ما يكون من الأفضل إنشاء صفيف جديد باستخدام وظيفة التصفية.

const array = [1,2,3,4];
array = array.filter(i => i !== 4); // [1,2,3]

هذا يحسن أيضا سهولة القراءة إيمهو. أنا لست من محبي الشريحة ، على الرغم من أنها تعرف أحيانًا أنه يجب عليك الذهاب إليها.

1
codepleb

حدد طريقة تسمى remove () على كائنات الصفيف باستخدام ميزة prototying في JavaScript.

استخدم لصق () طريقة لتلبية الاحتياجات الخاصة بك.

يرجى إلقاء نظرة على الكود أدناه.

Array.prototype.remove = function(item) {
    // index will have -1 if item does not exist
    // else it will have the index of 1st item found in array
    var index = this.indexOf(item); 

    if (index > -1) {
        // splice() method is used to add/remove items(s) in array
        this.splice(index, 1); 
    }

    return index;
}


var arr = [ 11, 22, 67, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4];

// Printing array
// [ 11, 22, 67, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4];
console.log(arr)

// Removing 67 (getting its index i.e. 2)
console.log("Removing 67")
var index = arr.remove(67)

if (index > 0){
    console.log("Item 67 found at ", index)
} else {
    console.log("Item 67 does not exist in array")
}

// Printing updated array
// [ 11, 22, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4];
console.log(arr)

// ............... Output ................................
// [ 11, 22, 67, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4 ]
// Removing 67
// Item 67 found at  2
// [ 11, 22, 45, 61, 89, 34, 12, 7, 8, 3, -1, -4 ]

ملاحظة: فيما يلي رمز المثال الكامل الذي تم تنفيذه على Node.js REPL الذي يصف استخدام Push () و pop () و shift () و unshift () و splice () أساليب.

> // Defining an array
undefined
> var arr = [12, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34];
undefined
> // Getting length of array
undefined
> arr.length;
16
> // Adding 1 more item at the end i.e. pushing an item
undefined
> arr.Push(55);
17
> arr
[ 12, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34, 55 ]
> // Popping item from array (i.e. from end)
undefined
> arr.pop()
55
> arr
[ 12, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
> // Remove item from beginning
undefined
> arr.shift()
12
> arr
[ 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
> // Add item(s) at beginning
undefined
> arr.unshift(67); // Add 67 at begining of the array and return number of items in updated/new array
16
> arr
[ 67, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
> arr.unshift(11, 22); // Adding 2 more items at the beginning of array
18
> arr
[ 11, 22, 67, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> // Define a method on array (temorarily) to remove an item and return the index of removed item; if it is found else return -1
undefined
> Array.prototype.remove = function(item) {
... var index = this.indexOf(item);
... if (index > -1) {
..... this.splice(index, 1); // splice() method is used to add/remove items in array
..... }
... return index;
... }
[Function]
>
> arr
[ 11, 22, 67, 45, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> arr.remove(45);   // Remove 45 (You will get the index of removed item)
3
> arr
[ 11, 22, 67, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> arr.remove(22)    // Remove 22
1
> arr
[ 11, 67, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
> arr.remove(67)    // Remove 67
1
> arr
[ 11, 67, 89, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> arr.remove(89)    // Remove 89
2
> arr
[ 11, 67, 34, 12, 7, 8, 3, -1, -4, -11, 0, 56, 12, 34 ]
>
> arr.remove(100);  // 100 doesn't exist, remove() will return -1
-1
>

شكر.

1
hygull

لصق ، تصفية وحذف لإزالة عنصر من مجموعة

كل صفيف لديه فهرسهم ويساعد على حذف عنصر معين مع فهرسهم.

طريقة splice ()

array.splice (الفهرس ، 1 ) ؛ المعلمة الأولى هي الفهرس والثاني هو رقم العنصر الذي

تريد حذف من هذا الفهرس.

لذلك لعنصر واحد نستخدم 1.

طريقة الحذف

حذف مجموعة [فهرس]

طريقة المرشح ()

إذا كنت تريد حذف العنصر المكرر في الصفيف ، فقم بتصفية الصفيف.

removeAll = array.filter (e => e! = elem)؛

حيث elem هو العنصر الذي تريد إزالته من الصفيف و array هو اسم الصفيف الخاص بك

1
ashish

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

array.splice (start [، deleteCount [، item1 [، item2 [، ...]]])

البدء

الفهرس الذي لبدء تغيير الصفيف (مع الأصل 0). إذا كان أكبر من طول المصفوفة ، فسيتم تعيين مؤشر البدء الفعلي على طول المصفوفة. إذا كانت سالبة ، سيبدأ العديد من العناصر من نهاية الصفيف (مع Origin -1) وسيتم تعيينه على 0 إذا كانت القيمة المطلقة أكبر من طول المصفوفة.

deleteCount اختياري

عدد صحيح يشير إلى عدد عناصر الصفيف القديم المراد إزالتها. إذا تم حذف deleteCount ، أو إذا كانت قيمته أكبر من array.length - start (أي ، إذا كان أكبر من عدد العناصر المتبقية في المصفوفة ، بدءًا من البداية) ، فكل العناصر من البداية إلى النهاية سيتم حذف مجموعة. إذا كان deleteCount يساوي 0 أو سالب ، فلن تتم إزالة أي عناصر. في هذه الحالة ، يجب عليك تحديد عنصر جديد واحد على الأقل (انظر أدناه).

item1 ، item2 ، ... اختياري

العناصر المراد إضافتها إلى الصفيف ، بدءًا من فهرس البداية. إذا لم تحدد أي عناصر ، فلن يؤدي لصق () إلا إلى إزالة العناصر من الصفيف.

للحصول على مزيد من ريجين يرجى مراجعة:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

0
ashish

هناك بالفعل الكثير من الإجابات ، ولكن نظرًا لأن أحداً لم يفعل ذلك باستخدام بطانة واحدة حتى الآن ، فقد تصورت أنني سأظهر طريقتي. يستفيد من حقيقة أن الدالة string.split () ستزيل كل الحروف المحددة عند تكوين صفيف. هنا مثال:

var ary = [1,2,3,4,1234,10,4,5,7,3];
out = ary.join("-").split("-4-").join("-").split("-");
console.log(out);

في هذا المثال ، تتم إزالة كل العناصر الأربعة من مجموعة الصفيف. ومع ذلك ، من المهم ملاحظة أن أي صفيف يحتوي على الحرف "-" سيؤدي إلى حدوث مشكلات في هذا المثال. باختصار ، سوف يتسبب ذلك في أن تقوم دالة join ("-") بجمع السلسلة الخاصة بك معًا بشكل غير صحيح. في مثل هذه الحالة ، يمكن استبدال جميع السلاسل "-" الموجودة في القصاصة أعلاه بأي سلسلة لن يتم استخدامها في الصفيف الأصلي. هنا مثال آخر:

var ary = [1,2,3,4,'-',1234,10,'-',4,5,7,3];
out = ary.join("[email protected]#").split("[email protected]#[email protected]#").join("[email protected]#").split("[email protected]#");
console.log(out);
0
Partial Science

جني الأرباح من طريقة الحد على النحو التالي:

الحالة أ) إذا كنت بحاجة إلى إزالة العنصر حسب الفهرس:

function remove(arr, index) {
  return arr.reduce((prev, x, i) => prev.concat(i !== index ? [x] : []), []);
}

الحالة ب) إذا كنت بحاجة إلى إزالة عنصر بقيمة العنصر (int):

function remove(arr, value) {
  return arr.reduce((prev, x, i) => prev.concat(x !== value ? [x] : []), []);
}

لذا ، يمكننا بهذه الطريقة إرجاع مجموعة جديدة (ستكون طريقة وظيفية رائعة - أفضل بكثير من استخدام الضغط أو اللصق) مع إزالة العنصر.

0
alejoko
Array.prototype.remove = function(x) {
    var y=this.slice(x+1);
    var z=[];
    for(i=0;i<=x-1;i++) {
        z[z.length] = this[i];
    }

    for(i=0;i<y.length;i++){
        z[z.length]=y[i];
    }

    return z;
}
0
user4109793
var arr =[1,2,3,4,5];

arr.splice(0,1)

console.log(arr)

الناتج [2 ، 3 ، 4 ، 5] ؛

0
Shahriar Ahmad