[javascript] কিভাবে আমি জাভাস্ক্রিপ্ট একটি অ্যারে থেকে একটি নির্দিষ্ট উপাদান মুছে ফেলতে পারি?


14 Answers

আমি আপনি 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];
Question

আমার পূর্ণসংখ্যার একটি অ্যারে আছে, এবং আমি এটি যোগ করার জন্য .push() পদ্ধতিটি ব্যবহার করছি।

একটি অ্যারের থেকে একটি নির্দিষ্ট উপাদান মুছে ফেলার জন্য একটি সহজ উপায় আছে? array.remove(int); মত কিছু সমতুল্য array.remove(int);

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




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

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

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

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

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

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

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




আপনি 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']



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

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

যদি আপনি একটি আইটেম সূচী জানেন

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

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

const items = ['a', 'b', 'c', 'd', 'e', 'f']
const i = 3
const filteredItems = items.slice(0, i-1).concat(items.slice(i, 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 তীর ফাংশন ব্যবহার করে। আপনি পুরানো ব্রাউজার সমর্থন করার জন্য ঐতিহ্যগত ফাংশন ব্যবহার করতে পারেন:

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

console.log(filteredItems)

অথবা আপনি বাবেল ব্যবহার করতে পারেন এবং ইএস 6 কোডটিকে 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)

মূল অ্যারে mutating এড়ানো

splice()(সঙ্গে বিভ্রান্ত করা হবে না slice()) মূল অ্যারে mutates, এবং এড়ানো উচিত।

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




আপডেট: আপনি যদি 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]



আপনি ES6 ব্যবহার করতে পারেন।

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

আউটপুট:

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



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

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

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




আপনি আপনার অ্যারের আপনার অ্যারে mutate করা উচিত নয়। এই কার্যকরী প্রোগ্রামিং প্যাটার্ন বিরুদ্ধে। আপনি যা করতে পারেন তা হল অ্যারে উল্লেখ না করে একটি নতুন অ্যারে তৈরি করুন যা আপনি এস 6 পদ্ধতির filter ব্যবহার করে ডেটা পরিবর্তন করতে চান;

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

ধরুন আপনি অ্যারে থেকে 5 মুছে ফেলতে চান তবে আপনি কেবল এটির মতো এটি করতে পারেন।

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

এটি আপনি যে মূল্যটি সরাতে চেয়েছিলেন তার জন্য আপনাকে একটি নতুন অ্যারে দেবে। সুতরাং ফলাফল হতে হবে

[1, 2, 4]

আরো বোঝার জন্য আপনি Array.filter এ MDN ডকুমেন্টেশনটি পড়তে পারেন filter




একটি অ্যারে থেকে অপসারণ করার জন্য আমার আরেকটি ভাল সমাধান আছে:

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

filter




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

// 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-উপাদান অ্যারের সাথে শেষ। জানি না কেন তবে আমি জন এর বাস্তব বাস্তবায়ন নিশ্চিত এই সমস্যা নেই।




আপনি filter পদ্ধতির সাথে সহজে এটি করতে পারেন:

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

এটি অ্যারে থেকে সমস্ত উপাদানগুলি সরিয়ে নেয় এবং আরও দ্রুত কাজ করে, তারপর স্লাইস এবং indexOf এর সমন্বয়




সমস্ত উত্তরগুলির উপর ভিত্তি করে যা মূলত সঠিক এবং বিবেচ্য সর্বোত্তম অনুশীলনের পরামর্শ দেওয়া হয়েছে (বিশেষত 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;
}

উপরের কাজটি পর্যালোচনা করার পরেও এটি সূক্ষ্ম কাজ করে, আমি বুঝতে পারছি কিছু কার্যকারিতা উন্নতি হতে পারে। এছাড়াও ES5 এর পরিবর্তে ES6 ব্যবহার করা অনেক ভাল পদ্ধতি। যে শেষ, এই উন্নত কোড:

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)

আমি বর্তমানে একটি ব্লগ পোস্ট লিখছি যার মধ্যে আমি কোন সমস্যা ছাড়াই অ্যারের জন্য কয়েকটি সমাধান বেঞ্চমার্ক করেছি এবং এটি চালানোর সময়টি তুলনা করে। আমি এই পোস্টটি শেষ করার পরে লিঙ্কটি দিয়ে এই আপডেটটি আপডেট করব। শুধু আপনাকে জানাতে, আমি লাউডস এর বিরুদ্ধে উপরে তুলনা করেছি এবং ব্রাউজার সমর্থন করলে Map, এটি লোডশে! লক্ষ্য করুন যে আমি ব্যবহার করছি না Array.prototype.indexOfঅথবা Array.prototype.includesexlcude ভ্যালুগুলিকে মোড়ানো Mapঅথবা Objectদ্রুত অনুসন্ধানের জন্য তৈরি করছি! ( https://jsperf.com/array-without-benchmark-against-lodash )




আপনার 1 থেকে 9 অ্যারের আছে এবং আপনি নীচের কোড ব্যবহার 5 মুছে ফেলতে চান।

var my_array = new Array();

যদি আপনি একাধিক মান প্রাক্তন করতে চান: - 1,7,8

my_array.push("element1");

যদি আপনি অ্যারের মধ্যে অ্যারে মান অপসারণ করতে চান প্রাক্তন: - [3,4,5]

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

সমর্থিত ব্রাউজার লিঙ্ক রয়েছে




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 (splice) ব্যবহার করুন:

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

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

indexof সরানো চেয়ে প্রায় 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



আপনি একটি খালি স্পট রাখা বা না চান উপর নির্ভর করে।

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

delete array[ index ];

যদি আপনি না করেন, আপনি splice পদ্ধতি ব্যবহার করা উচিত:

array.splice( index, 1 );

এবং যদি আপনি সেই আইটেমের মানটির প্রয়োজন বোধ করেন, তবে আপনি কেবল ফেরত অ্যারের উপাদানটি সংরক্ষণ করতে পারেন:

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

যদি আপনি কোনও ক্রমে এটি করতে চান তবে আপনি array.pop() জন্য array.pop() কে শেষ বা array.shift() জন্য ব্যবহার করতে পারেন (এবং উভয় আইটেমটির array.shift() )।

এবং যদি আপনি আইটেমের সূচীটি জানেন না, তবে আপনি এটি পেতে একটি array.indexOf( item ) তে array.indexOf( item ) ব্যবহার করতে পারেন। array.indexOf( item ) যদি কোনও সূচী বা -1 পাওয়া না থাকে।




Related