আমি কীভাবে একটি অ্যারে থেকে নির্দিষ্ট আইটেমটি সরিয়ে ফেলব?


8274

আমার সংখ্যার একটি অ্যারে রয়েছে এবং আমি .push()এটিতে উপাদান যুক্ত করার জন্য পদ্ধতিটি ব্যবহার করছি ।

অ্যারে থেকে একটি নির্দিষ্ট উপাদান অপসারণ করার কি সহজ উপায় আছে?

আমি যেমন কিছু সমতুল্য খুঁজছি:

array.remove(number);

আমাকে কোর জাভাস্ক্রিপ্ট ব্যবহার করতে হবে । ফ্রেমওয়ার্ক অনুমোদিত নয়।

উত্তর:


11861

আপনি যে indexঅ্যারে উপাদানটি ব্যবহার করে মুছে ফেলতে চান তার সন্ধান করুন indexOfএবং তারপরে সেই সূচকটি সরিয়ে ফেলুন 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স্থানে অ্যারে পরিবর্তন করে এবং সরানো হয়েছে এমন উপাদানগুলি সহ একটি নতুন অ্যারে প্রদান করে returns


সম্পূর্ণতার কারণে, এখানে ফাংশন রয়েছে। প্রথম ফাংশন শুধুমাত্র একক সংঘটন (অর্থাত প্রথম ম্যাচে সরানোর সরিয়ে ফেলা 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;
}

14
@ পিটার, হ্যাঁ আপনি ঠিক বলেছেন। এই নিবন্ধটি আরও বিশদে ব্যাখ্যা করেছে এবং বেমানান ব্রাউজারগুলির জন্য একটি কার্যকারিতা রয়েছে: বিকাশকারী.মোজিলা.আর
টম ওয়াডলি

32
@ আলেকজান্ডারওয়াইচারস ওয়াজ অবশ্যই এটি অর্ডার সংরক্ষণ করে, যদি তা না হয় তবে এটি একেবারে মূল্যহীন হবে
TheZ


14
@AdrianP। array.indexOf(testValue)খালি অ্যারেতে -1 হবে এবং আপনি যদি এটির জন্য পরীক্ষা করছেন তবে কোনও বিচ্ছিন্নতা নেই। এর পরে সম্ভবত উত্তরটি পরিবর্তন হয়েছে।
দ্য ক্রিক

12
আইই 7, আইই 8, আই 9, আই 10 মাইক্রোসফ্ট নিজেই অসমর্থিত, কেন ওয়েব বিকাশকারীরা সেই পুরানো ব্রাউজারগুলিকে সমর্থন করবে? ব্রাউজারটি আপগ্রেড করার বিষয়ে বিজ্ঞপ্তিটি কেবল দেখান! সমর্থন.
microsoft.com/en-us/lifecycle/…

1261

আমি জানি না আপনি কী array.remove(int)আচরণ করবেন বলে আশা করছেন। তিনটি সম্ভাবনা রয়েছে যা আমি চাইলে ভাবতে পারি might

একটি সূচীতে একটি অ্যারের উপাদান সরানোর জন্য 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];

332
deleteঅ্যারে থেকে কোনও উপাদান সরানোর সঠিক উপায় নয়!
ফেলিক্স ক্লিং

70
@ ফেলিক্সক্লিং এটি নির্ভর করে, আপনি যদি এটি তৈরি করতে চান তবে এটি কাজ করে যাতে array.hasOwnProperty(i)ফিরে আসে falseএবং সেই অবস্থানে ফিরে আসার উপাদান থাকে undefined। তবে আমি স্বীকার করব যে এটি করা খুব সাধারণ জিনিস নয়।
পিটার ওলসন

87
deleteঅ্যারের দৈর্ঘ্য আপডেট করবে না সত্যই উপাদানটিকে মুছবে না, কেবলমাত্র এটি বিশেষ মান দিয়ে প্রতিস্থাপন করবে undefined
ডায়োসনি

33
@ ডিওসনি আপনি যখন বলবেন এটি আসলে উপাদানটি মুছবে না তখন আপনি কী বলতে চাইছেন তা আমি জানি না। তদ্ব্যতীত, এটি সূচকটির সাথে মানটির পরিবর্তে আরও বেশি কিছু করে undefined: এটি সূচী এবং অ্যারে থেকে উভয় মান সরিয়ে দেয়, তারপরে delete array[0], "0" in arrayমিথ্যা ফিরিয়ে দেবে।
পিটার ওলসন

16
@ গ্রান্ট গ্রিকজান দুঃখিত, আমি দ্বিমত পোষণ করছি। এটি অপসারণের প্রয়োজনীয়তা আমি দেখছি না। উপরের পাঠ্যটি এটি কী করে তা স্পষ্টভাবে ব্যাখ্যা করে এবং এটি এমন লোকদের সহায়তা করে যা জানেন না যে deleteতারা কীভাবে প্রত্যাশা মতো কাজ করে না তা বুঝতে কী করে।
পিটার ওলসন

1200

২০১ 2016 সালের অক্টোবরে সম্পাদিত

  • এটি সহজ, স্বজ্ঞাত এবং স্পষ্ট করে নিন ( ওকামের রেজার )
  • এটি পরিবর্তনযোগ্য (মূল অ্যারেটি অপরিবর্তিত থাকবে)
  • স্ট্যান্ডার্ড জাভাস্ক্রিপ্ট ফাংশন দিয়ে এটি করুন, যদি আপনার ব্রাউজার তাদের সমর্থন না করে - পলিফিল ব্যবহার করুন

এই কোড উদাহরণে আমি অ্যারে থেকে অযাচিত আইটেমগুলি সরিয়ে ফেলতে "অ্যারে.ফিল্টার (...)" ফাংশনটি ব্যবহার করি । এই ফাংশনটি মূল অ্যারে পরিবর্তন করে না এবং একটি নতুন তৈরি করে। যদি আপনার ব্রাউজার এই ফাংশনটি সমর্থন করে না (যেমন সংস্করণ 9 এর পূর্বে ইন্টারনেট এক্সপ্লোরার, বা 1.5 সংস্করণের আগে ফায়ারফক্স), মজিলা থেকে ফিল্টার পলফিল ব্যবহার বিবেচনা করুন ।

আইটেম সরানো (ECMA-262 সংস্করণ 5 কোড ওরফে পুরানো স্টাইল জাভাস্ক্রিপ্ট)

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 ]

গুরুত্বপূর্ণ ECMAScript 6 "() => {}" তীর ফাংশন সিনট্যাক্স মোটেই ইন্টারনেট এক্সপ্লোরার, 45 সংস্করণের আগে ক্রোম, 22 সংস্করণের আগে ফায়ারফক্স এবং 10 সংস্করণের আগে সাফারি সমর্থিত নয়। পুরানো ব্রাউজারগুলিতে ECMAScript 6 সিনট্যাক্স ব্যবহার করতে আপনি ব্যাবেলজেএস ব্যবহার করতে পারেন ।


একাধিক আইটেম সরানো (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 (...)" ফাংশন 9 সংস্করণ আগে, 43 সংস্করণ সামনে এ সব ইন্টারনেট এক্সপ্লোরার, ক্রোম 47 সংস্করণ আগে, ফায়ারফক্স সমর্থিত নয় সাফারি এবং এজ আগে 14 সংস্করণ, যাতে এখানে মোজিলা থেকে polyfill হয়

একাধিক আইটেম সরানো (ভবিষ্যতে, সম্ভবত)

যদি "এই-বাইন্ডিং সিন্ট্যাক্স" প্রস্তাবটি সর্বদা গৃহীত হয় তবে আপনি এটি করতে সক্ষম হবেন:

// 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 ]

ব্যাবেলজেএস এ নিজে চেষ্টা করুন :)

উল্লেখ


5
তবে, কখনও কখনও আমরা আসল অ্যারে থেকে উপাদান অপসারণ করতে চাই (অস্থাবর নয়) উদাহরণস্বরূপ কৌনিক 2 * এনজি নির্দেশের জন্য ব্যবহৃত অ্যারে
রবীন্দ্র পায়েল

42
গৃহীত সমাধানের চেয়ে ভাল কারণ এটি কোনও ম্যাচের একমাত্র ঘটনা অনুমান করে না এবং অপরিবর্তনীয়তা বেশি পছন্দনীয়
গ্রেগ

12
filterএকটি বড় অ্যারের জন্য অবশ্যই অনেক ধীর হতে হবে?
নাথান

2
আপনি যদি উদাহরণগুলিতে একই পরিবর্তনশীলের অ্যাসাইনমেন্ট ব্যবহার করেন তবে অপরিবর্তনীয়তার বিন্দুটি কী? :)
মেনচ

11
এটি একটি দুর্দান্ত উত্তর। ফিল্টারিং না পরিবর্তনের জন্য স্প্লাইস একটি বিশেষ কাজ। filterধীর পারফরম্যান্স থাকতে পারে তবে এটি নিরাপদ এবং আরও ভাল কোড। এছাড়াও, আপনি ল্যাম্বডায় একটি দ্বিতীয় যুক্তি নির্দিষ্ট করে সূচক দ্বারা ফিল্টার করতে পারেন:arr.filter((x,i)=>i!==2)
ম্যাথু

448

এটি নির্ভর করে আপনি খালি জায়গা রাখতে চান কিনা।

আপনি যদি খালি স্লট চান, মুছুন ঠিক আছে:

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 প্রদান করে। 


24
deleteঅ্যারে থেকে কোনও উপাদান সরানোর সঠিক উপায় নয় !!
প্রোগো

15
আপনি যদি "একটি স্লট খালি করতে চান", ব্যবহার করুন array[index] = undefined;। ব্যবহার deleteঅপ্টিমাইজেশন ধ্বংস করবে।
বার্গি

3
@ জাকব খুব ভাল মন্তব্য করেছেন কারণ আমি বুঝতে পেরেছি যে আমি অনেক সময় হারিয়েছি এবং ভেবেছিলাম আমার অ্যাপ্লিকেশন কোডটি কোনওভাবে ভেঙে গেছে ...
পাস্কাল

আপনি সূচক থেকে যা পান তার ব্যাখ্যা দিয়ে শেষ অনুচ্ছেদটি সত্যই সহায়ক ছিল
এ।

276

ইন্টারনেট এক্সপ্লোরার 8- এ একটি বন্ধুর সমস্যা ছিল এবং সে কী করেছিল তা আমাকে দেখিয়েছিল। আমি তাকে বলেছিলাম এটি ভুল ছিল, এবং তিনি আমাকে বলেছিলেন যে তিনি উত্তর পেয়েছেন এখানে। বর্তমান শীর্ষের উত্তরটি সমস্ত ব্রাউজারে কাজ করবে না (উদাহরণস্বরূপ ইন্টারনেট এক্সপ্লোরার 8) এবং এটি কেবলমাত্র আইটেমটির প্রথম উপস্থিতি সরিয়ে ফেলবে।

একটি অ্যারের থেকে সমস্ত দৃষ্টান্ত সরান

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

এটি পিছনে অ্যারের মধ্য দিয়ে লুপ করে (যেহেতু সূচিপত্র এবং দৈর্ঘ্য আইটেমগুলি সরানোর সাথে সাথে পরিবর্তিত হবে) এবং আইটেমটি পাওয়া গেলে সরিয়ে দেয়। এটি সমস্ত ব্রাউজারে কাজ করে।


10
@ স্রোস এটি হওয়া উচিত নয় কারণ লুপটি শুরু হয় i = arr.length -1বা i--সর্বাধিক সূচক হিসাবে একই হয়। arr.lengthএর জন্য কেবল একটি প্রাথমিক মান ii--এটি সর্বদা সত্য হবে (এবং প্রতিটি লুপ অপে 1 করে হ্রাস করা) যতক্ষণ না এটি সমান হয় 0(একটি মিথ্যা মান) এবং লুপটি তখন বন্ধ হয়ে যায়।
gmajivu

1
দ্বিতীয় ফাংশন বরং অদক্ষ। প্রতিটি পুনরাবৃত্তিতে "indexOf" অ্যারের শুরু থেকে অনুসন্ধান শুরু করবে।
ujeenator

3
অ্যাম্বেডব্ল্যাক, ১ টিরও বেশি সংখ্যক আইটেমের সংকলন সহ , এর পরিবর্তে ফিল্টার পদ্ধতিটি কল করা আরও ভাল arr.filter(function (el) { return el !== item })multiple এটি কিছুটা বেশি মেমোরি খরচ করে তবে অনেক বেশি দক্ষতার সাথে পরিচালিত হয়, যেহেতু কম কাজ করা দরকার।
ইউজিন কুজমেনকো

1
@ আলজে, এটি কেবল আই 9 + থেকে পাওয়া যায়। এখনও একটি সুযোগ আছে যে এটি কাজ করবে না।
ujeenator

1
এই উত্তরটি আমার পক্ষে কাজ করেছিল কারণ আমার বেশ কয়েকটি আইটেম সরানো প্রয়োজন তবে কোনও নির্দিষ্ট ক্রমে নয়। এখানে লুপের পিছনের অগ্রগতি অ্যারে থেকে আইটেমগুলি পুরোপুরি সরিয়ে নিয়েছে।
মিনিটস্কি

171

দুটি প্রধান পন্থা রয়েছে:

  1. বিভাজন () :anArray.splice(index, 1);

  2. মুছুন :delete anArray[index];

আপনি যখন অ্যারের জন্য মুছুন ব্যবহার করেন তখন সাবধান হন। এটি অবজেক্টের বৈশিষ্ট্যগুলি মুছে ফেলার জন্য ভাল তবে অ্যারেগুলির পক্ষে তেমন ভাল নয়। spliceঅ্যারেগুলির জন্য ব্যবহার করা ভাল ।

মনে রাখবেন যে আপনি যখন deleteঅ্যারের জন্য ব্যবহার করেন তখন আপনি এর জন্য ভুল ফলাফল পেতে পারেন anArray.length। অন্য কথায়, deleteউপাদানটি সরিয়ে ফেলবে, তবে এটি দৈর্ঘ্যের সম্পত্তির মান আপডেট করবে না।

আপনি মুছে ফেলা ব্যবহার করার পরে সূচী সংখ্যায় ছিদ্র থাকতেও আশা করতে পারেন, উদাহরণস্বরূপ আপনি মুছে ফেলার আগে 1, 3, 4, 8, 9, এবং 11 এবং দৈর্ঘ্য যেমন দৈর্ঘ্যের সাথে শেষ করতে পারেন। সেক্ষেত্রে সমস্ত ইনডেক্সযুক্ত forলুপ ক্র্যাশ হয়ে যাবে, যেহেতু সূচীগুলি আর ক্রমযুক্ত নয়।

আপনি যদি কোনও কারণে ব্যবহার করতে বাধ্য হন deleteতবে আপনাকে for eachঅ্যারেগুলির মাধ্যমে লুপ করার সময় লুপগুলি ব্যবহার করা উচিত । প্রকৃতপক্ষে for, যদি সম্ভব হয় তবে সর্বদা তালিকাভুক্ত লুপগুলি এড়িয়ে চলুন । এইভাবে কোডটি আরও শক্তিশালী এবং সূচীগুলির সাথে সমস্যায় কম প্রবণ হবে।


144
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)


14
আমি এই পদ্ধতির কোনও বড় অনুরাগী নই। আপনি যদি বিভিন্ন লাইব্রেরি বা ফ্রেমওয়ার্ক ব্যবহার করে শেষ করেন তবে এগুলি একে অপরের সাথে বিরোধের অবসান ঘটাতে পারে।
চার্লি কিলিয়ান

10
: খারাপ ধারণা, এই পোস্টটিকে দেখতে পারবেন stackoverflow.com/questions/948358/array-prototype-problem
MMeah

10
আপনি যদি for inঅ্যারেতে একটি করছেন , আপনার ইতিমধ্যে একটি সমস্যা আছে।
জিরাক

2
আপনি যদি for inঅ্যারেতে করেন তবে আপনার ইতিমধ্যে আরও বড় সমস্যা রয়েছে।
রেইনব

অবজেক্ট.ডেফাইনপ্রপার্টি স্ট্যাকওভারফ্লো.com/a/35518127/3779853 ব্যবহার করুন এবং আপনি যেতে ভাল।
phil294

105

ব্যবহার করার দরকার নেই 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(সূচিপত্র):

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);
    }
  }
}

1000 উপাদানগুলির সাথে অ্যারে জন্য নোডেজগুলিতে রান-টাইম (গড়ে 10000 রানের বেশি):

সূচকটি সরানোর চেয়ে প্রায় 10x ধীর । এমনকি যদি কল সরানোর দ্বারা উন্নত 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

5
এখানে উপস্থাপিত 'মুভ' পদ্ধতিটি সমস্ত ব্রাউজারে কাজ করা উচিত বলে মনে হচ্ছে, এবং অতিরিক্ত অ্যারে তৈরি করা এড়াতে হবে; এখানে অন্যান্য বেশিরভাগ সমাধানগুলির মধ্যে একটি বা উভয়ই এই সমস্যা রয়েছে। আমি মনে করি এটি "সুন্দর" হিসাবে না দেখলেও এটি অনেক বেশি ভোটের দাবিদার।
সক্কমঙ্ক

73

এটি একটি মানের পরিবর্তে একটি শিকারী সরবরাহ করে।

দ্রষ্টব্য: এটি প্রদত্ত অ্যারে আপডেট করবে এবং আক্রান্ত সারিগুলি ফিরিয়ে দেবে।

ব্যবহার

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

আমি জানি না যে আপনার -1 চেক প্রয়োজন (i> -1)। এছাড়াও, আমি মনে করি এই ফাংশনগুলি অপসারণের চেয়ে ফিল্টারের মতো আরও বেশি কাজ করে। আপনি যদি সারি.আইড === 5 পাস করেন তবে এর ফলাফলটি কেবল আইডি 5 সহ একটি অ্যারেতে আসবে, সুতরাং এটি অপসারণের বিপরীতে কাজ করছে। এটি ES2015 এ দেখতে দুর্দান্ত দেখাচ্ছে: var ফলাফল = অ্যারেহেল্পার.রেমোভ (আমারআরে, সারি => রো.আইডি === 5);
কি শীতল হবে

@WhatWouldBeCool এই ফাংশন মূল অ্যারের সংশোধন করে, এবং সরানো আইটেমটি পরিবর্তে আসতে একটি নতুন অ্যারেতে ফলাফলের অনুলিপি এর
AMD

68

আপনি এটি ফিল্টার পদ্ধতিতে সহজেই করতে পারেন :

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


3
এটি কী দ্রুত আপনার উত্স আছে?
ব্যবহারকারী 3711421

2
সুন্দর সমাধান। তবে আপনি যেমন উল্লেখ করেছেন তবে টাক তৈরি করা গুরুত্বপূর্ণ, এটি টুকরো এবং সূচকের মতো একই ফল দেয় না কারণ এটি 1
ইউজার 37111121

1
@ ব্যবহারকারী 37৩111121 এটি কারণ কেবল টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টানা কাজগুলি "নির্দিষ্ট উপাদান মুছতে" তিনি চান না। এটি কেবল একবারে উপাদানটিকে সরিয়ে দেয়, এটি সুনির্দিষ্ট উপাদানটিকে সরিয়ে দেয় তাদের মধ্যে
সালভাদোর ডালি

66

জন রেসিগ একটি ভাল বাস্তবায়ন পোস্ট করেছেন :

// 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-উপাদান অ্যারে থাকে এবং আপনি এটি সহ 9 তম উপাদানটি সরানোর চেষ্টা করেন:

myArray.remove(8);

আপনি একটি 8-উপাদান অ্যারের সাথে শেষ করুন। কেন জানি না তবে আমি নিশ্চিত করেছি যে জন এর মূল প্রয়োগটিতে এই সমস্যা নেই।


Object.prototype.hasOwnPropertyসর্বদা ব্যবহার করা কেন ভাল ধারণা তা কেবলমাত্র হার্ড উপায় দ্বারা শিখেছি
¬¬

64

অ্যান্ডস্কোর.জেএস একাধিক ব্রাউজারগুলির সাহায্যে সমস্যাগুলি সমাধান করতে ব্যবহার করা যেতে পারে। এটি উপস্থিত থাকলে ইন-বিল্ড ব্রাউজার পদ্ধতি ব্যবহার করে। পুরানো ইন্টারনেট এক্সপ্লোরার সংস্করণগুলির ক্ষেত্রে যদি তারা অনুপস্থিত থাকে তবে এটি নিজস্ব কাস্টম পদ্ধতি ব্যবহার করে।

অ্যারে থেকে উপাদানগুলি অপসারণের একটি সহজ উদাহরণ (ওয়েবসাইট থেকে):

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

মার্জিত এবং সংক্ষিপ্ত হলেও, ওপি স্পষ্টভাবে কেবল কোর জেএস
ইজেনফুল

64

আপনি ES6 ব্যবহার করতে পারেন। উদাহরণস্বরূপ এই ক্ষেত্রে মান '3' মুছুন:

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

আউটপুট:

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

4
এই উত্তরটি দুর্দান্ত কারণ এটি সরাসরি আসলটি পরিবর্তনের পরিবর্তে মূল অ্যারের একটি অনুলিপি তৈরি করে।
ক্লডিও Holanda

দ্রষ্টব্য: অ্যারে.প্রোটোটাইপ.ফিল্টারটি ECMAScript 5.1 (নয় IE8)। আরও সুনির্দিষ্ট সমাধানের জন্য: stackoverflow.com/a/54390552/8958729
চ্যাং

54

আপনি যদি মুছে ফেলা অবস্থানগুলি সরিয়ে একটি নতুন অ্যারে চান, আপনি সর্বদা নির্দিষ্ট উপাদান মুছতে পারেন এবং অ্যারে ফিল্টার আউট করতে পারেন। এটি ব্রাউজারগুলির জন্য অ্যারের অবজেক্টের বর্ধনের প্রয়োজন হতে পারে যা ফিল্টার পদ্ধতি বাস্তবায়িত করে না, তবে দীর্ঘমেয়াদে এটি সহজ যেহেতু আপনি যা করেন তা হ'ল:

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]


45

এই কোডটি দেখুন। এটি প্রতিটি বড় ব্রাউজারে কাজ করে ।

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);

4
@ রোল্যান্ডইলিগ একটি for inলুপ ব্যবহার না করে এবং স্ক্রিপ্টটি আগে থামতে পারে তা বাদ দিয়ে সরাসরি লুপ থেকে ফলাফল ফিরিয়ে দিয়ে। Upvotes যুক্তিসঙ্গত;)
yckart

1
এটি ছোট অ্যারেগুলির জন্য একটি দুর্দান্ত পদ্ধতি। এটি প্রতিটি ব্রাউজারে কাজ করে, ন্যূনতম এবং স্বজ্ঞাত কোড ব্যবহার করে এবং কোনও অতিরিক্ত জটিল ফ্রেমওয়ার্ক, শিমস বা পলিফিল ছাড়াই।
বিজেজর

আমার ইয়কার্টের মন্তব্যেও পুনরাবৃত্তি করা উচিত যা for( i = 0; i < arr.length; i++ )এটি আরও ভাল পদ্ধতির হতে পারে কারণ ব্রাউজার আইটেমগুলি (সহ for in) সংরক্ষণ করার সিদ্ধান্ত নেয় তার বিপরীতে সঠিক সূচকগুলি সংরক্ষণ করে । এটি করার ফলে আপনাকে যদি প্রয়োজন হয় তবে একটি মানের অ্যারে সূচক পেতে দেয়।
বিজেজর

41

আপনি লডাশ _.পুল ( মুউটেট অ্যারে), _.পুলআউট (মিউটেট অ্যারে) বা _.বিহীন ( অ্যারেটি পরিবর্তন করতে পারবেন না ),

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']

2
ওপি অনুরোধ হিসাবে এটি মূল জেএস নয়, তাই না?
কিছু-অ-বর্ণনাকারী ব্যবহারকারী

12
@ কিছু-অ-বর্ণনাকারী-ব্যবহারকারী আপনি ঠিক বলেছেন। তবে আমার মতো প্রচুর ব্যবহারকারী এখানে কেবল ওপি-র জন্য নয়, একটি সাধারণ উত্তর খুঁজছেন।
চুন ইয়াং

@ চুনইয়াং আপনি একেবারে ঠিক বলেছেন। আমি ইতিমধ্যে লোডাশ ব্যবহার করছি, যদি সময় সাশ্রয় হয় তবে এটি কেন ব্যবহার করবেন না।
int-i

38

ES6 এবং কোনও রূপান্তর ছাড়াই: (অক্টোবর 2016)

const removeByIndex = (list, index) =>
      [
        ...list.slice(0, index),
        ...list.slice(index + 1)
      ];
         
output = removeByIndex([33,22,11,44],1) //=> [33,11,44]
      
console.log(output)


কেন শুধু filterতখন ব্যবহার করবেন না ? array.filter((_, index) => index !== removedIndex);
user4642212

@ user4642212 আপনি ঠিক বলেছেন! এছাড়াও, আমি
গোলং

36

অ্যারে থেকে একটি নির্দিষ্ট উপাদান / স্ট্রিং অপসারণ ওয়ান-লাইনারে করা যেতে পারে:

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

কোথায়:

theArray : অ্যারের আপনার কাছ থেকে কিছু বিশেষ সরাতে চান

স্ট্রিংটোরোমোভ ফ্রেমআরে : আপনি যে স্ট্রিংটি মুছতে চান এবং 1 এটি হ'ল উপাদানগুলির পরিমাণ যা আপনি সরাতে চান।

দ্রষ্টব্য : যদি "stringToRemoveFromArray" আপনার অ্যারেতে অবস্থিত না হয় তবে এটি অ্যারের শেষ উপাদানটি সরিয়ে ফেলবে।

উপাদানটি অপসারণের আগে আপনার অ্যারেতে উপাদানটি বিদ্যমান কিনা তা পরীক্ষা করা সর্বদা ভাল অনুশীলন।

if (theArray.indexOf("stringToRemoveFromArray") >= 0){
   theArray.splice(theArray.indexOf("stringToRemoveFromArray"), 1);
}

আপনার ক্লায়েন্টের কম্পিউটারগুলিতে আপনার যদি নতুন একমাস্ক্রিপ্ট সংস্করণে অ্যাক্সেস থাকে (সতর্কতা, পুরানো স্টেশনগুলিতে কাজ নাও করতে পারে):

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

যেখানে '3' এমন মান যা আপনি অ্যারে থেকে সরিয়ে নিতে চান। অ্যারে তখন পরিণত হবে:['1','2','4','5','6']


রেডিও বোতাম টগলিংয়ের উপর ভিত্তি করে একটি অ্যারে আপডেট করার চেষ্টা করার সময় এটি আমার জন্য কাজ করেছিল।
jdavid05

4
সাবধান, যদি "stringToRemoveFromArray"আপনার অ্যারেতে অবস্থিত না হয় তবে এটি অ্যারের শেষ উপাদানটি সরিয়ে ফেলবে।
ফিউশন

35

জাভাস্ক্রিপ্ট ব্যবহার করে অ্যারে থেকে কোনও আইটেম সরানোর কয়েকটি উপায় এখানে রয়েছে ।

বর্ণিত সমস্ত পদ্ধতি মূল অ্যারেটি পরিবর্তন করে না , পরিবর্তে একটি নতুন তৈরি করে।

যদি আপনি কোনও আইটেমের সূচি জানেন

মনে করুন আপনার কাছে অ্যারে রয়েছে এবং আপনি কোনও আইটেমকে অবস্থান থেকে সরাতে চান i

একটি পদ্ধতি ব্যবহার করা হয় slice():

const items = ['a', 'b', 'c', 'd', 'e', 'f']
const i = 3
const filteredItems = items.slice(0, i).concat(items.slice(i+1, items.length))

console.log(filteredItems)

slice()সূচকগুলি গ্রহণ করে এটি একটি নতুন অ্যারে তৈরি করে। আমরা সূচক থেকে শুরু করে সূচি থেকে অপসারণ করতে চাইলে কেবল নতুন অ্যারে তৈরি করি এবং অ্যারের শেষের দিকে আমরা যেটিকে সরিয়েছি তার পরে প্রথম অবস্থান থেকে অন্য অ্যারে সংযুক্ত করি।

মান জানলে

এই ক্ষেত্রে, একটি ভাল বিকল্প ব্যবহার করা হয় filter(), যা আরও বেশি ঘোষণামূলক পদ্ধতির প্রস্তাব দেয়:

const items = ['a', 'b', 'c', 'd', 'e', 'f']
const valueToRemove = 'c'
const filteredItems = items.filter(item => item !== valueToRemove)

console.log(filteredItems)

এটি ES6 তীর ফাংশন ব্যবহার করে। আপনি পুরানো ব্রাউজারগুলিকে সমর্থন করতে traditionalতিহ্যগত ফাংশনগুলি ব্যবহার করতে পারেন:

const items = ['a', 'b', 'c', 'd', 'e', 'f']
const valueToRemove = 'c'
const filteredItems = items.filter(function(item) {
  return item !== valueToRemove
})

console.log(filteredItems)

অথবা আপনি বাবেল ব্যবহার করতে পারেন এবং পুরাতন ব্রাউজারগুলিকে আরও হজমযোগ্য করতে ES6 কোডটি আবার ES5 এ স্থানান্তর করতে পারেন, তবুও আপনার কোডটিতে আধুনিক জাভাস্ক্রিপ্ট লিখুন।

একাধিক আইটেম সরানো হচ্ছে

যদি কোনও একক আইটেমের পরিবর্তে, আপনি অনেকগুলি আইটেম সরিয়ে নিতে চান?

আসুন এর সহজ সমাধানটি সন্ধান করি।

সূচক দ্বারা

আপনি কেবল একটি ফাংশন তৈরি করতে এবং সিরিজের আইটেমগুলি সরাতে পারেন:

const items = ['a', 'b', 'c', 'd', 'e', 'f']

const removeItem = (items, i) =>
  items.slice(0, i-1).concat(items.slice(i, items.length))

let filteredItems = removeItem(items, 3)
filteredItems = removeItem(filteredItems, 5)
//["a", "b", "c", "d"]

console.log(filteredItems)

মান দ্বারা

আপনি কলব্যাক ফাংশনের ভিতরে অন্তর্ভুক্তির জন্য অনুসন্ধান করতে পারেন:

const items = ['a', 'b', 'c', 'd', 'e', 'f']
const valuesToRemove = ['c', 'd']
const filteredItems = items.filter(item => !valuesToRemove.includes(item))
// ["a", "b", "e", "f"]

console.log(filteredItems)

আসল অ্যারেটি পরিবর্তন করতে এড়িয়ে চলুন

splice()(বিভ্রান্ত না হয়ে slice()) আসল অ্যারেটিকে রূপান্তরিত করে এবং এড়ানো উচিত।

(মূলত https://flaviocopes.com/how-to-remove-item-from-array/ এ পোস্ট করা হয়েছে )


34

ঠিক আছে, উদাহরণস্বরূপ আপনার নীচে অ্যারে রয়েছে:

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];

এগুলি সবগুলি পরীক্ষা করার জন্য আমাদের একটি লুপ প্রয়োজন, তবে একটি অন্তর্নির্মিত জাভাস্ক্রিপ্ট ফাংশন ব্যবহার করা সহজ এবং আরও কার্যকর উপায় হ'ল, সুতরাং আমরা একটি ফাংশন লিখি যা নীচের মতো একটি ফিল্টার ব্যবহার করে:

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]

এছাড়াও তৃতীয় পক্ষের গ্রন্থাগারগুলি রয়েছে যা আপনাকে এটি করতে সহায়তা করে, যেমন লোদাশ বা ইন্ডসকোর। আরও তথ্যের জন্য, লডাশ _.পুল, _.পুলআউট বা _.বিহীন দেখুন।


একটি ছোট টাইপ আছে। সংশোধন করুন. this.splice(num.indexOf(x), 1);=>this.splice(this.indexOf(x), 1);
থিগওয়া

দয়া করে জাভাস্ক্রিপ্ট-এ বিল্ট-ইনগুলি (অ্যারে.প্রোটোটাইপগুলিতে ফাংশনগুলি সংযুক্ত করুন) বৃদ্ধি করবেন না। এটি ব্যাপকভাবে খারাপ অভ্যাস হিসাবে বিবেচিত হয়।
আইকারু

আমি সম্মত হই যে এটি বিশ্বের সবচেয়ে ভাল কাজ নয়, তবে এই ক্ষেত্রে আপনি কীভাবে এটিকে কার্য সম্পাদন করতে পারেন?
আলিরেজা

আপনার সূচিটি পরীক্ষা করা উচিত। যদি সূচক = -1, স্প্লাইস (-1,1) শেষ উপাদানটি সরিয়ে ফেলবে
রিচার্ড চ্যান

29

আমি জাভাস্ক্রিপ্টে বেশ নতুন এবং এই কার্যকারিতা প্রয়োজন। আমি কেবল এটি লিখেছি:

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");

আউটপুট - যেমন প্রত্যাশিত ["আইটেম 1", "আইটেম 1"]

আমার চেয়ে আপনার আলাদা আলাদা চাহিদা থাকতে পারে, তাই এগুলি উপযুক্ত হয়ে আপনি সহজেই এটিকে সংশোধন করতে পারেন। আমি আশা করি এটা কারো সাহায্যে লাগবে.


1
আপনার অ্যারেটি যদি সত্যিই দীর্ঘ হয় এবং এর মধ্যে উপাদানটির বেশ কয়েকটি উদাহরণ রয়েছে তবে এটি ভয়াবহ আচরণ করতে চলেছে। অ্যারের সূচি সূচকটি প্রতিবারের শুরুতে শুরু হবে, সুতরাং আপনার ব্যয়টি ও (এন ^ 2) হতে চলেছে।
জাগ


27

অ্যারেতে যদি জটিল অবজেক্ট থাকে তবে আপনি ফিল্টার ব্যবহার করতে পারবেন? এমন পরিস্থিতিতে যেখানে in .inArray বা অ্যারে.স্প্লাইস ব্যবহার করা তত সহজ নয়। বিশেষত যদি বস্তুগুলি অ্যারেতে অগভীর হয়।

উদাহরণস্বরূপ, যদি আপনার আইডি ক্ষেত্রের সাথে কোনও জিনিস থাকে এবং আপনি একটি অ্যারের থেকে অবজেক্টটি সরিয়ে নিতে চান:

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

এইভাবে আমি এটি করতে পছন্দ করি। একটি তীর ফাংশন ব্যবহার করে এটি ওয়ান-লাইনার হতে পারে। আমি অভিনয় সম্পর্কে আগ্রহী। এটি অ্যারে প্রতিস্থাপন করে যে কিছুই মূল্যবান । পুরানো অ্যারের রেফারেন্স সহ যে কোনও কোড পরিবর্তনটি লক্ষ্য করবে না।
জোয়েটউইল

27

আমি ECMAScript 6 এর উপর ভিত্তি করে উত্তর দিতে চাই । ধরুন, আপনার নীচের মতো একটি অ্যারে রয়েছে:

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]

ইঙ্গিত : আপনি খালি অ্যারে না পেলে ফিল্টার কলব্যাকের জন্য দয়া করে একটি তীর ফাংশন ব্যবহার করুন।


25

আপডেট: আপনি ECMAScript 2015 (পূর্বে ES6 হিসাবে পরিচিত) ব্যবহার করতে না পারলে এই পদ্ধতিটি কেবলমাত্র সুপারিশ করা হয়। আপনি যদি এটি ব্যবহার করতে পারেন তবে অন্যান্য উত্তরগুলি এখানে আরও পরিষ্কার বাস্তবায়ন সরবরাহ করে।


এখানে এই सारটি আপনার সমস্যার সমাধান করবে এবং যুক্তিটির সমস্ত উপস্থিতিও কেবল 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]

25

কর্মক্ষমতা

আজ (2019-12-09) আমি নির্বাচিত সমাধানগুলির জন্য ম্যাকোস ভি 10.13.6 (উচ্চ সিয়েরা) এর উপর পারফরম্যান্স পরীক্ষা করি। আমি delete(এ) দেখাই , তবে আমি অন্যান্য পদ্ধতির তুলনায় এটি ব্যবহার করি না, কারণ এটি অ্যারেতে ফাঁকা জায়গা রেখেছিল।

সিদ্ধান্তে

  • দ্রুততম সমাধানটি হল array.splice(সি) (ছোট অ্যারেগুলিতে সাফারি বাদে যেখানে এটি দ্বিতীয়বার রয়েছে)
  • বড় অ্যারেগুলির জন্য, array.slice+splice(এইচ) হ'ল ফায়ারফক্স এবং সাফারির জন্য দ্রুততম স্থাবর সমাধান; Array.from(খ) ক্রোমে দ্রুততম
  • পরিবর্তনীয় দ্রবণগুলি সাধারণত অপরিবর্তনের চেয়ে 1.5x-6x দ্রুত হয়
  • সাফারিতে ছোট ছোট টেবিলগুলির জন্য, আশ্চর্যজনকভাবে পরিবর্তনীয় সমাধান (সি) অপরিবর্তনীয় দ্রবণ (জি) এর চেয়ে ধীর

বিস্তারিত

পরীক্ষায় আমি বিভিন্ন উপায়ে অ্যারে থেকে মাঝারি উপাদানটি সরিয়ে ফেলি। এ, সি সমাধান জায়গা আছে। বি, ডি, ই, এফ, জি, এইচ সমাধান অপরিবর্তনীয় হয়।

10 টি উপাদান সহ অ্যারের জন্য ফলাফল

এখানে চিত্র বিবরণ লিখুন

ক্রোম-এ array.splice(সি) হ'ল স্থানের সমাধান দ্রুত। array.filter(ঘ) দ্রুততম অপরিবর্তনীয় সমাধান। সবচেয়ে ধীরতম্যটি হল array.slice(এফ)। আপনি এখানে আপনার মেশিনে পরীক্ষা করতে পারেন ।

1.000.000 উপাদান সহ অ্যারের জন্য ফলাফল

এখানে চিত্র বিবরণ লিখুন

ক্রোম-এ array.splice(সি) হ'ল দ্রুততম ইন-প্লেস সলিউশন (দ্য delete(সি) একই রকম দ্রুত - তবে এটি অ্যারেতে খালি স্লট ছেড়ে গেছে (যাতে এটি 'সম্পূর্ণ অপসারণ' সম্পাদন করে না))। array.slice-splice(এইচ) দ্রুততম অপরিবর্তনীয় সমাধান। সবচেয়ে ধীরতম্যটি হল array.filter(ডি এবং ই)। আপনি এখানে আপনার মেশিনে পরীক্ষা করতে পারেন ।

ব্রাউজারগুলির জন্য তুলনা: ক্রোম v78.0.0, সাফারি v13.0.4 এবং ফায়ারফক্স v71.0.0

এখানে চিত্র বিবরণ লিখুন


24

আপনার আরে কখনই পরিবর্তন করা উচিত নয়। যেহেতু এটি কার্যকরী প্রোগ্রামিং প্যাটার্নের বিরুদ্ধে। আপনি ECMAScript 6 পদ্ধতি ব্যবহারের ডেটা পরিবর্তন করতে চান অ্যারেটি উল্লেখ না করেই আপনি একটি নতুন অ্যারে তৈরি করতে পারেন 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

আরও বোঝার জন্য আপনি অ্যারে.ফিল্টারে এমডিএন ডকুমেন্টেশন পড়তে পারেন ।


21

আরও আধুনিক, ECMAScript 2015 (পূর্বে হারমনি বা ইএস 6 নামে পরিচিত) পদ্ধতির। প্রদত্ত:

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

তারপর:

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

ফলনশীল:

[1, 2, 4]

এটি ব্রাউজারগুলিতে ভালভাবে সমর্থিত তা নিশ্চিত করতে আপনি বাবেল এবং একটি পলিফিল পরিষেবা ব্যবহার করতে পারেন ।


4
নোট করুন যে .filterএকটি নতুন অ্যারে প্রদান করে যা একই অ্যারে থেকে উপাদানটি সরিয়ে ফেলার মতো নয়। এই পদ্ধতির সুবিধা হ'ল আপনি এক সাথে অ্যারে পদ্ধতিগুলি চেইন করতে পারেন। উদাহরণস্বরূপ:[1,2,3].filter(n => n%2).map(n => n*n) === [ 1, 9 ]
কোডওসেলোট

দুর্দান্ত, আমার যদি অ্যারেতে 600k উপাদান থাকে এবং প্রথম 50 কে সরাতে চাই, আপনি কি এই আস্তে কল্পনা করতে পারেন? এটি সমাধান নয়, ফাংশনের প্রয়োজন রয়েছে যা কেবল উপাদানগুলি সরিয়ে দেয় এবং কিছুই দেয় না।
dev1223

@ সেরাফ তার জন্য, আপনি সম্ভবত ব্যবহার করতে চান spliceবা slice
bjfletcher

@ বিজেফ্লেচার আরও ভাল, অপসারণের প্রক্রিয়াতে, কেবলমাত্র 50 কে উপাদান বরাদ্দ করুন এবং সেগুলি কোথাও নিক্ষেপ করুন। (স্লাইস 550 কে উপাদানগুলির সাথে, তবে সেগুলি উইন্ডো থেকে ছোঁড়া ছাড়াই)।
dev1223

আমি বিজেফ্লেচারের উত্তরটি পছন্দ করব, যা সংক্ষিপ্ত হতে পারে items= items.filter(x=>x!=3)। এছাড়াও, ওপি বড় ডেটা সেট করার কোনও প্রয়োজনীয়তার কথা জানায় না।
রান

21

অ্যারেতে আপনার 1 থেকে 9 টি রয়েছে এবং আপনি 5 টি সরাতে চান the নীচের কোডটি ব্যবহার করুন:

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, 1,7 and 8 removed", newNumberArray);


আপনি যদি একটি অ্যারেতে একটি অ্যারের মান সরিয়ে নিতে চান। উদাহরণ: [৩,৪,৫]

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);

সমর্থিত ব্রাউজারটি লিংক অন্তর্ভুক্ত


19

আমি জানি ইতিমধ্যে প্রচুর উত্তর রয়েছে, তবে তাদের মধ্যে অনেকের মনে হয় সমস্যাটি খুব জটিল হয়ে গেছে। এখানে একটি কী-এর সমস্ত দৃষ্টান্ত অপসারণের একটি সহজ, পুনরাবৃত্তিমূলক উপায় - সূচিটি পাওয়া না পাওয়া পর্যন্ত সেলকে কল করে। হ্যাঁ, এটি কেবল ব্রাউজারগুলিতেই কাজ করে 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);
}

কেবল একটি নোট, এই পদ্ধতির 1 টি সতর্কতা হ'ল স্ট্যাক ওভারফ্লোসের সম্ভাব্য। আপনি যদি বড় অ্যারে নিয়ে কাজ না করেন তবে আপনার কোনও সমস্যা হবে না।
wharding28

তবে কেন মাঝখানে ফেরা? এটি কার্যকরভাবে একটি গেটো স্টেটমেন্ট।
পিটার মর্টেনসেন

18

উপাদানগুলির একাধিক উদাহরণ থাকলে সূচকগুলি স্ক্রু না করে তা নিশ্চিত করতে আপনি একটি পশ্চাদপদ লুপ করতে পারেন।

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);
}

সরাসরি নমুনা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.