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


403

আমার একটি অ্যারে রয়েছে যা আমি টাইপস্ক্রিপ্টে তৈরি করেছি এবং এর একটি সম্পত্তি রয়েছে যা আমি কী হিসাবে ব্যবহার করি। যদি আমার কাছে কীটি থাকে তবে আমি কীভাবে এটি থেকে কোনও আইটেম সরিয়ে ফেলতে পারি?

উত্তর:


638

জাভাস্ক্রিপ্টে আপনি যেমন করেন তেমনভাবে।

delete myArray[key];

নোট করুন যে এটিতে উপাদানটিকে সেট করে undefined

Array.prototype.spliceফাংশনটি ব্যবহার করা আরও ভাল :

const index = myArray.indexOf(key, 0);
if (index > -1) {
   myArray.splice(index, 1);
}

8
আপনি যে এক প্রকার যুক্ত করতে পারেন! var index: number = myArray.indexOf(key, 0);
CorayThan

17
@ কোরাইথান অবশ্যই এটি প্রত্যক্ষভাবে টাইপ করা হবে যেমন indexOfএকটি রিটার্ন হিসাবে number?
ক্রিস

5
@ ক্রিস এই সাধারণ ক্ষেত্রে এটি স্পষ্টরূপে, আপনি প্রতিটি ভেরিয়েবলের জন্য কোনও প্রকার স্পষ্টভাবে সংজ্ঞায়িত করলে এটি আপনাকে বাগগুলি দ্রুত নির্ণয় করতে সহায়তা করতে পারে। আপনি indexইতিমধ্যে একাধিকবার ব্যবহার করেছেন এবং সেই জায়গাগুলির মধ্যে একটি ( splice) একটি সংখ্যা দেখতে চায় বা আপনি একটি ত্রুটি পাবেন। বর্তমানে সংকলক সেখানে ভুল করতে আপনাকে রোধ করতে পারে না।
জোখেম কুইজ্পার্স

33
@ ব্লারকফিশ এটি উল্লেখ করা ভাল যে আপনার যদি অবজেক্টের একটি তালিকা থাকে তবে আপনি এটি ব্যবহার করতে পারেন var index = myArray.findIndex(x => x.prop==key.prop);
ফ্রান্সিসকো ক্যাব্রাল

6
@ Cirelli94 - আপনি কোনও পুরানো থ্রেডের প্রতিক্রিয়া জানাচ্ছেন, তবে আপনার প্রশ্নের উত্তর হ'ল একটি অ্যারের উপাদান মুছলে তার দৈর্ঘ্য পরিবর্তন হয় না বা অ্যারেটিকে পুনরায় সূচি হয় না। কারণ অ্যারে জাভাস্ক্রিপ্ট মধ্যে অবজেক্ট, delete myArr[2]আক্ষরিক মুছে ফেলে সম্পত্তি 2 এর myArr, যা থেকে ভিন্ন myArr[2] = undefined। এই গল্পের নৈতিকতা কেবলমাত্র spliceএই কাজের জন্য ব্যবহার করা কারণ এটি বিভ্রান্তিকর পার্শ্ব প্রতিক্রিয়া ছাড়াই পছন্দসই প্রভাব পাওয়ার একটি নিরাপদ উপায়।
উইংলারডব্লু

199

অ্যারে যদি বস্তুর ধরণ হয় তবে সহজতম উপায় way

let foo_object // Item to remove
this.foo_objects = this.foo_objects.filter(obj => obj !== foo_object);

19
এটি কেবল ফিল্টার করে এমন কিছু সরিয়ে দেয় না। যদি তালিকাকে বাস্তবে পরিবর্তন করতে হয় তবে এটি উপায় নয়।
ব্যবহারকারী573434

5
@ user573434 হ্যাঁ, আপনি ঠিক বলেছেন, নামটি সূচিত করে। তবে আপনি সফল মুছে যাওয়া এপি কল ইত্যাদির কোনও বিষয় মুছে ফেলতে চান এমন ক্ষেত্রে এটি সহজ পদ্ধতি
মালিক শাহজাদ

3
এটি আমার জন্য কোনও অনন্য কী সম্পত্তি ছাড়াই অবজেক্টগুলির অ্যারেতে পুরোপুরি কাজ করেছিল। @ user573434 ফিল্টার পদ্ধতিটি ফিল্টার করা অবজেক্ট ছাড়াই একটি নতুন অ্যারে প্রদান করে, ফলে ফলাফলগুলি অ্যারেটি অপসারণ করে।
জেসন

6
আমি মনে করি এটির একটি বস্তু হিসাবে এটির জন্য আপনাকে এটি করতে হবেthis.foo_objects = this.foo_objects.filter(obj => obj !== foo_object)[0];
রোল

1
এইটা কাজ করে. শুধু সাবধানে দ্বিতীয় লাইন পড়ুন। সে আপত্তি সহ একটি ফিল্টার করে! = foo_object। এবং এটি মূল ভেরিয়েবলকে বরাদ্দ করে, এইভাবে একটি মূল বিয়োগফলকে ফিল্টার করা foo_object এর সাথে প্রতিস্থাপন করে। আইডি সহ অবজেক্টগুলির অ্যারে দিয়ে এটি ব্যবহার করেছেন deleteById(id: string) { this.data = this.data.filter(d => d.id !== id); }কেবলমাত্র একটি শব্দ সতর্কবার্তা, যদি আইডিগুলি অনন্য না হয় তবে আপনি এটির মাধ্যমে সমস্ত সরিয়ে id
মার্কাস

74

ES6 এর সাহায্যে আপনি এই কোডটি ব্যবহার করতে পারেন:

removeDocument(doc){
   this.documents.forEach( (item, index) => {
     if(item === doc) this.documents.splice(index,1);
   });
}

1
অ্যারে রেফারেন্স পরিবর্তন না করে এবং সুনির্দিষ্ট সমতা অ্যালগরিদম বাস্তবায়নের সম্ভাবনা সহ অপসারণের সেরা সমাধান
সিড

1
সেরা উত্তর খুঁজে পেয়েছেন
Gvs আখিল


2
আপনি এটিও ব্যবহার করতে পারেন: this.documents.forEach ((আইটেম, সূচক, অ্যারে) => {যদি (আইটেম === ডক) অ্যারে.স্প্লাইস (সূচক, 1);}); যা অনেক ক্লিনার হতে পারে, বিশেষত নেস্টেড অ্যারেগুলির সাথে কাজ করার সময়।
সিগুন্ডল্যাচ

20

এটি এর জন্য আমার সমাধান:

onDelete(id: number) {
    this.service.delete(id).then(() => {
        let index = this.documents.findIndex(d => d.id === id); //find index in your array
        this.documents.splice(index, 1);//remove element from array
    });

    event.stopPropagation();
}

এই সমাধানটি সম্পর্কে দুর্দান্ত যা হ'ল এটি তখনও কাজ করবে যখন বস্তুর সমতা দুটি বস্তু সমান হিসাবে চিহ্নিত করতে ব্যর্থ হয়।
ব্র্যাড জনসন

18

spliceউপাদানগুলি সরানোর জন্য আপনি অ্যারেতে পদ্ধতিটি ব্যবহার করতে পারেন ।

উদাহরণস্বরূপ যদি আপনার নামের সাথে কোনও অ্যারে থাকে arrতবে নিম্নলিখিতটি ব্যবহার করুন:

arr.splice(2, 1);

সুতরাং এখানে সূচক 2 সহ উপাদানটি সূচনা বিন্দু হবে এবং আর্গুমেন্ট 2 নির্ধারণ করবে যে কতগুলি উপাদান মোছা হবে।

আপনি যদি নামের অ্যারের শেষ উপাদানটি মুছতে চান arrতবে এটি করুন:

arr.splice(arr.length-1, 1);

এটি শেষ উপাদানটি মোছার সাথে আর্ট ফিরে আসবে।

উদাহরণ:

var arr = ["orange", "mango", "banana", "sugar", "tea"];
arr.splice(arr.length-1, 1)
console.log(arr); // return ["orange", "mango", "banana", "sugar"]

1
শুধু এফওয়াইআই, স্প্লাইস পদ্ধতি অ্যারেটি পরিবর্তন করে (সুতরাং এই ক্ষেত্রে শেষ আইটেমটি সরিয়ে দেয়) এবং সরানো আইটেম (গুলি) প্রদান করে, অ্যারে নিজেই নয় not
সিগুন্ডল্যাচ

2
শেষ উপাদানটি অপসারণ করতে এটি আসলে arr.splice (arr.leth-1,1) হওয়া উচিত।
স্টিভ ইন সিও

15

বিভাগগুলি একটি অ্যারে হয়। আপনি এই অ্যারে থেকে কোনও আইটেম সরাতে চান।

departments: string[] = [];

 removeDepartment(name: string): void {
    this.departments = this.departments.filter(item => item != name);
  }

8

অবজেক্টের অ্যারে থেকে সম্পত্তি দ্বারা কোনও বস্তু সরানোর জন্য এখানে একটি সহজ একটি লাইনার।

delete this.items[this.items.findIndex(item => item.item_id == item_id)];

অথবা

this.items = this.items.filter(item => item.item_id !== item.item_id);

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

যে ইশারা জন্য ধন্যবাদ। আমি মনে করি আমার ব্যবহারের ক্ষেত্রে আমি এটি এখনও আবিষ্কার করতে পারি নি। ভালভাবে লক্ষ্য করা গেছে :)
জ্যামি আর্মার

5

টাইপস্ক্রিপ্ট স্প্রেড অপারেটর (...) ব্যবহার করে উত্তর দিন

// Your key
const key = 'two';

// Your array
const arr = [
    'one',
    'two',
    'three'
];

// Get either the index or -1
const index = arr.indexOf(key); // returns 0


// Despite a real index, or -1, use spread operator and Array.prototype.slice()    
const newArray = (index > -1) ? [
    ...arr.slice(0, index),
    ...arr.slice(index + 1)
] : arr;

5

টাইপস্ক্রিপ্ট ব্যবহার করে আরও একটি সমাধান:

let updatedArray = [];
for (let el of this.oldArray) {
    if (el !== elementToRemove) {
        updated.push(el);
    }
}
this.oldArray = updated;

এটি যদি জিজ্ঞাসা করা সমস্যার সমাধান করে তবে এটি কার্যকর করা ব্যয়বহুল কারণ একটি নতুন অ্যারের তৈরি এবং আসলটি লুপ করে। বিশাল অ্যারেতে এই ধরণের অপারেশন করা অনাকাঙ্ক্ষিত পার্শ্ব প্রতিক্রিয়া তৈরি করতে পারে যেমন, মোবাইল ব্যাটারিগুলির চেয়ে শক্ত, দীর্ঘ প্রতীক্ষা, জাঙ্ক ইত্যাদি
জেসি

1

এটি ব্যবহার করুন, যদি আপনাকে কোনও অ্যারে থেকে প্রদত্ত বস্তুটি সরানোর প্রয়োজন হয় এবং আপনি নীচের বিষয়ে নিশ্চিত হতে চান:

  • তালিকাটি পুনরায় চালু করা হয় না
  • অ্যারের দৈর্ঘ্য সঠিকভাবে আপডেট করা হয়েছে
    const objWithIdToRemove;
    const objIndex = this.objectsArray.findIndex(obj => obj.id === objWithIdToRemove);
    if (objIndex > -1) {
      this.objectsArray.splice(objIndex, 1);
    }

0

একটি অ্যারের জন্য কেবল এক্সটেনশন পদ্ধতি যুক্ত করতে চেয়েছিলেন।

interface Array<T> {
      remove(element: T): Array<T>;
    }

    Array.prototype.remove = function (element) {
      const index = this.indexOf(element, 0);
      if (index > -1) {
        return this.splice(index, 1);
      }
      return this;
    };
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.