জাভাস্ক্রিপ্টে অ্যারের উপাদানগুলি মোছা হচ্ছে - বনাম স্প্লাইস মুছুন


1333

ব্যবহার মধ্যে পার্থক্য কি অপারেটর হিসেবে ব্যবহার বিরোধিতা অ্যারের উপাদান পদ্ধতি ?deleteArray.splice

উদাহরণ স্বরূপ:

myArray = ['a', 'b', 'c', 'd'];

delete myArray[1];
//  or
myArray.splice (1, 1);

স্প্লাইস পদ্ধতিতে কেন আমি যদি বস্তুর সাথে আমার মতো অ্যারে উপাদানগুলি মুছতে পারি তবে?


3
জন্য .splice: লুপ মধ্যে, এই প্রশ্নের কটাক্ষপাত আছে জাভাস্ক্রিপ্ট মধ্যে অ্যারে থেকে মুছে ফেলুন
রব ডাব্লু

6
@ অ্যান্ডনোরম্যান্যাক্স হ্যাঁ, তবে এই উত্তরটি পরের দিন পোস্ট করা হয়েছিল, এবং আরও অনেকগুলি ভোট পেয়েছিল - আমি বলব এটি আরও ভাল লেখা হয়েছে, এটি অবশ্যই হবে।
ক্যামিলো মার্টিন

@ Andynormancx - এটি একটি সঠিক সদৃশ বলে মনে হচ্ছে না। আপনি যে প্রশ্নটি সংযুক্ত করেছেন তা মূলত জিজ্ঞাসা করছে যে কোনও অ্যারের থেকে কোনও উপাদান মুছলে (এভাবে এটিকে ছড়িয়ে দেওয়া হয়) কেন তার দৈর্ঘ্য হ্রাস পাবে না। এই প্রশ্নের মধ্যে পার্থক্য জানতে চাইছে deleteএবং Array.prototype.splice
ছারভে

@ ছারভে সম্মত হয়েছেন, আরও গুরুত্বপূর্ণভাবে যদিও এই প্রশ্নটি 9 বছর আগে পোস্ট করা যেতে পারে! এ সম্পর্কে এখানে মন্তব্য করে ফিরে আসতে আমাকে বৃদ্ধ মনে হচ্ছে
andynormancx

উত্তর:


1692

deleteবস্তুর সম্পত্তি মুছে ফেলবে, তবে অ্যারেটিকে পুনরায় সংযুক্ত করবে না বা এর দৈর্ঘ্য আপডেট করবে না। এটি এটিকে এমনভাবে উপস্থিত করে তোলে যেন এটি অপরিজ্ঞাত:

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> delete myArray[0]
  true
> myArray[0]
  undefined

দ্রষ্টব্য যে এটি আসলে মান হিসাবে সেট করা হয়নি undefined, বরং সম্পত্তিটি অ্যারে থেকে সরিয়ে ফেলা হবে, এটি এটিকে অপরিজ্ঞাত হিসাবে প্রদর্শিত হবে । emptyঅ্যারে লগ করার সময় ক্রোম ডেভ সরঞ্জামগুলি মুদ্রণের মাধ্যমে এই পার্থক্যটি পরিষ্কার করে ।

> myArray[0]
  undefined
> myArray
  [empty, "b", "c", "d"]

myArray.splice(start, deleteCount) আসলে উপাদানটি সরিয়ে দেয়, অ্যারের সাথে পুনরায় সূচি দেয় এবং এর দৈর্ঘ্য পরিবর্তন করে।

> myArray = ['a', 'b', 'c', 'd']
  ["a", "b", "c", "d"]
> myArray.splice(0, 2)
  ["a", "b"]
> myArray
  ["c", "d"]

74
আসলে, delete না উপাদান সরাতে পারে তবে অ্যারের reindex না অথবা তার দৈর্ঘ্য (যা ইতিমধ্যে সাবেক দ্বারা উহ্য হয় দৈর্ঘ্য সবসময় সর্বোচ্চ সূচক +1 যেহেতু) আপডেট করুন।
ফেলিক্স ক্লিং

3
জেএস্লিন্ট delete myArray[0]" অপারেটর প্রত্যাশিত এবং পরিবর্তে 'মুছুন' দেখেছেন সিনট্যাক্স পছন্দ করেন না " spliceব্যবহারের প্রস্তাব দেওয়া হয়।
চোখের

21
@ আই: আসলে, জেএসলিন্ট কেবল আগের লাইনে একটি সেমিকোলনের অভাব সম্পর্কে অভিযোগ করছে। এবং আপনি একে অপরের উপরে সত্যই সুপারিশ করতে পারবেন না, যেহেতু তারা সম্পূর্ণ আলাদা জিনিস করে ...
রাই-

3
"এই ক্ষেত্রে মুছুন কেবলমাত্র উপাদানটিকে পূর্বনির্ধারিত হিসাবে সেট করবে:" না, এটি পুরোপুরি ভুল। তার মাঝে একটি মৌলিক পার্থক্য delete myArray[0]এবং myArray[0] = undefined। পূর্ববর্তী ক্ষেত্রে, সম্পত্তিটি অ্যারে অবজেক্ট থেকে পুরোপুরি সরিয়ে ফেলা হয়। দ্বিতীয় ক্ষেত্রে, সম্পত্তিটি রয়েছে মান সহ undefined
টিজে ক্রাউডার

1
এফওয়াইআই, ক্রোম দেব সরঞ্জামগুলি একটি মুছে ফেলা (বা অবিচ্ছিন্ন) অ্যারে উপাদানের মধ্যে পার্থক্যটি উন্নত করার emptyপরিবর্তে কীওয়ার্ডটি দেখায় undefinedযার আসল মান রয়েছে undefined। নোট করুন যেহেতু আমি এটি বলেছি তার অর্থ এটি কেবল হিসাবে প্রদর্শিত হয় emptyএবং এটি প্রকৃত মান হিসাবে উল্লেখ করে না empty(যা বিদ্যমান নেই)।
ছারভে

340

অ্যারে.রেমোভ () পদ্ধতি

জন রেসিগ , jQuery এর স্রষ্টা একটি খুব সহজ Array.removeপদ্ধতি তৈরি করেছিলেন যা আমি সবসময় এটি আমার প্রকল্পগুলিতে ব্যবহার করি।

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

এবং এটি কীভাবে ব্যবহার করা যেতে পারে তার কয়েকটি উদাহরণ এখানে রয়েছে:

// Remove the second item from the array
array.remove(1);
// Remove the second-to-last item from the array
array.remove(-2);
// Remove the second and third items from the array
array.remove(1,2);
// Remove the last and second-to-last items from the array
array.remove(-2,-1);

জন ওয়েবসাইট


4
অ্যারে.রেমোভ () এর জন্য +1। তবে স্ট্রিং আর্গুমেন্টগুলি (বেশিরভাগ অ্যারে পদ্ধতিগুলির মতো নয়, যেমন [1,2,3].slice('1'); // =[2,3]) পাস করার কারণে এটি সন্তুষ্ট নয় , সুতরাং এটির পক্ষে এটি পরিবর্তন করা নিরাপদvar rest = this.slice(parseInt(to || from) + 1 || this.length);
রিচার্ড ইঙ্গলিস

1
@ টমরং, জাভাস্ক্রিপ্টে কোনও থ্রেড নেই, এবং ফাংশনটি কার্যকর করে this.push.apply(this, rest), তারপরে ফিরে আসা মানটি ফেরত দেয়
বিল

59
এটি প্রশ্নের কোনও উত্তর দেয় না।
Ry-

16
শুধু স্প্লাইস () ব্যবহার করবেন না কেন? এই ফাংশনের নাম, প্যারামিটারের নাম এবং ফলাফল সুস্পষ্ট নয়। আমার প্রস্তাবটি কেবল স্প্লাইস (সূচক, দৈর্ঘ্য) ব্যবহার করা - (অ্যান্ডি হিউমের উত্তর দেখুন)
auco

3
উপরোক্ত প্রদত্ত ফাংশন বর্ণিত হিসাবে কাজ করে, তবুও for(var i in array)চক্রের সাথে অ্যারের মাধ্যমে পুনরাবৃত্তি করার সময় এটি অযাচিত পার্শ্ব প্রতিক্রিয়া তৈরি করে । আমি এটি সরিয়েছি এবং এর পরিবর্তে স্প্লাইস ব্যবহার করেছি।
আলেক্সিকোট

104

মোছা হ'ল অ্যারেতে থাকা উপাদান থেকে কেবল বস্তুটিকে সরিয়ে দেয়, অ্যারের দৈর্ঘ্য পরিবর্তন হবে না। স্প্লাইজটি বস্তুটি সরিয়ে আরেটিকে ছোট করে।

নিম্নলিখিত কোডটি "a", "খ", "অপরিজ্ঞাত", "d" প্রদর্শন করবে

myArray = ['a', 'b', 'c', 'd']; delete myArray[2];

for (var count = 0; count < myArray.length; count++) {
    alert(myArray[count]);
}

যদিও এটি "a", "b", "d" প্রদর্শন করবে

myArray = ['a', 'b', 'c', 'd']; myArray.splice(2,1);

for (var count = 0; count < myArray.length; count++) {
    alert(myArray[count]);
}

11
দ্বিতীয় উদাহরণে অস্পষ্টতা বাদে দুর্দান্ত উদাহরণটি 1,1 ব্যবহার করে - প্রথম 1টি স্প্লাইস শুরু করতে অ্যারেতে থাকা সূচককে বোঝায়, দ্বিতীয় 1 অপসারণের উপাদানগুলির সংখ্যা। তাই মূল এরে, ব্যবহার থেকে 'গ' মুছে ফেলার জন্যmyArray.splice(2,1)
iancoleman

68

অ্যারে থেকে কোনও উপাদানটির প্রতিটি ঘটনা কীভাবে সরিয়ে ফেলতে হয় তা বোঝার চেষ্টা করার সময় আমি এই প্রশ্নটিতে হোঁচট খেয়েছি। এখানে একটি তুলনা এর spliceএবং deleteপ্রত্যেক সরানোর জন্য 'c'থেকে itemsএরে।

var items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];

while (items.indexOf('c') !== -1) {
  items.splice(items.indexOf('c'), 1);
}

console.log(items); // ["a", "b", "d", "a", "b", "d"]

items = ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'];

while (items.indexOf('c') !== -1) {
  delete items[items.indexOf('c')];
}

console.log(items); // ["a", "b", undefined, "d", "a", "b", undefined, "d"]

14

কোর জাভাস্ক্রিপ্ট থেকে 1.5 রেফারেন্স> অপারেটর> বিশেষ অপারেটর> অপারেটর মুছুন :

আপনি যখন অ্যারে উপাদানটি মুছবেন তখন অ্যারের দৈর্ঘ্য প্রভাবিত হবে না। উদাহরণস্বরূপ, আপনি যদি একটি [3] মুছে ফেলেন তবে একটি [4] এখনও একটি [4] এবং একটি [3] অপরিবর্তিত রয়েছে। আপনি অ্যারের শেষ উপাদানটি মুছুন এমনকি (এটি [aleleth-1] মুছুন) এমনকি এটি ধরে রাখে।


10

splice সংখ্যা সূচকগুলি নিয়ে কাজ করবে।

যেখানে deleteঅন্য ধরণের সূচকের বিরুদ্ধে ব্যবহার করা যায় ..

উদাহরণ:

delete myArray['text1'];

9
আপনি যখন 'অন্য কোনও ধরণের সূচকগুলি' বলছেন, আপনি আর অ্যারে সম্পর্কে আর কথা বলছেন না, বরং বস্তুগুলি যা ওপি সম্পর্কে জিজ্ঞাসা করছে।
ইয়া জিয়াং

2
@ ইজিয়াং: অ্যারেগুলি অবজেক্ট। চিহ্নিতকরণ বৈশিষ্ট্য। এখানে কোন পার্থক্য নেই.
বার্গি

9

এটি সম্ভবত উল্লেখযোগ্য যে স্লাইস কেবল অ্যারেগুলিতে কাজ করে। (ধারাবাহিক অর্ডার অনুসরণ করতে অবজেক্টের বৈশিষ্ট্যগুলির উপর নির্ভর করা যায় না))

কোনও বস্তু থেকে কী-মান জোড়টি সরানোর জন্য, মুছে ফেলা হ'ল আসলে যা আপনি চান:

delete myObj.propName;     // , or:
delete myObj["propName"];  // Equivalent.

মুছুন অ্যারে কীগুলি পুনঃক্রম করতে পারে না, সুতরাং: var অ্যারে = [1,2,3,4,5]; আরআর মুছুন [3]; (var i = 0; i <= arr.leth; i ++) কনসোল.লগের জন্য (আরআর [i]); অপ্রত্যাশিত ফলাফল প্রদর্শন করা হবে।
ক্রিস্টিয়ান উইলিয়ামস

এটা সত্য. সুতরাং যদি না আপনি সেই স্থানে একটি অপরিজ্ঞাত আইটেমটি ছেড়ে না চান, তবে অ্যারের কীগুলিতে মুছুন না! মুছে ফেলার সঠিক ব্যবহারের একটি রেফারেন্স অন্তর্ভুক্ত করার জন্য আমি মূলত এই মন্তব্যটি যুক্ত করেছি।
jtrick

তবে মুছুন কেন অপ্রত্যাশিত ফলাফল ফেলবে ??
অ্যালেক্স

9

বনাম স্প্লাইস মুছুন

আপনি যখন অ্যারে থেকে কোনও আইটেম মুছবেন

var arr = [1,2,3,4]; delete arr[2]; //result [1, 2, 3:, 4]
console.log(arr)

আপনি বিচ্ছিন্ন যখন

var arr = [1,2,3,4]; arr.splice(1,1); //result [1, 3, 4]
console.log(arr);

ক্ষেত্রে ডিলিট উপাদান মুছে ফেলা হয় কিন্তু সূচক খালি রয়ে

এর ক্ষেত্রে যখন সংযুক্ত করান উপাদান মুছে যাবে এবং বাকি উপাদানের সূচক অনুসারে কমে যাবে


8

যেমন উপরে অনেকবার বলা হয়েছে, ব্যবহারকে splice()নিখুঁত ফিট বলে মনে হয়। মজিলায় ডকুমেন্টেশন:

splice()পদ্ধতি বিদ্যমান উপাদান সরানোর এবং / অথবা নতুন উপাদান যোগ করে একটি অ্যারের বিষয়বস্তু পরিবর্তন।

var myFish = ['angel', 'clown', 'mandarin', 'sturgeon'];

myFish.splice(2, 0, 'drum'); 
// myFish is ["angel", "clown", "drum", "mandarin", "sturgeon"]

myFish.splice(2, 1); 
// myFish is ["angel", "clown", "mandarin", "sturgeon"]

বাক্য গঠন

array.splice(start)
array.splice(start, deleteCount)
array.splice(start, deleteCount, item1, item2, ...)

পরামিতি

শুরু

অ্যারে পরিবর্তন শুরু করার সূচি। অ্যারের দৈর্ঘ্যের চেয়ে বড় হলে প্রকৃত সূচনা সূচি অ্যারের দৈর্ঘ্যে সেট করা হবে। যদি নেতিবাচক হয়, শুরু হবে যে শেষ থেকে অনেক উপাদান।

deleteCount

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

যদি ডিলিটকাউন্ট বাদ দেওয়া হয় তবে ডিলিটকাউন্ট সমান হবে (arr.length - start).

আইটেম 1, আইটেম 2, ...

শুরু সূচক থেকে শুরু করে অ্যারেতে যুক্ত করার উপাদানগুলি। আপনি যদি কোনও উপাদান নির্দিষ্ট না splice()করেন তবে অ্যারে থেকে উপাদানগুলি সরিয়ে ফেলবে।

ফেরত মূল্য

মুছে ফেলা উপাদানগুলি সহ একটি অ্যারে। যদি কেবল একটি উপাদান সরিয়ে ফেলা হয় তবে একটি উপাদানের একটি অ্যারে ফিরে আসে। যদি কোনও উপাদান অপসারণ না করা হয় তবে একটি খালি অ্যারে ফিরে আসে।

[...]


@ ডাউনভোটার: ডাউনভোট কেন? যত্ন নিতে হবে, না?
সার্ভ-ইন 10

7

অ বাস্তব বাস্তব পরিস্থিতির মতো কাজগুলি মুছুন , এটি কেবল আইটেমটি সরিয়ে দেয় তবে অ্যারের দৈর্ঘ্য একই থাকে:

নোড টার্মিনাল থেকে উদাহরণ:

> var arr = ["a","b","c","d"];
> delete arr[2]
true
> arr
[ 'a', 'b', , 'd', 'e' ]

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

function(arr,arrIndex){
    return arr.slice(0,arrIndex).concat(arr.slice(arrIndex + 1));
}

উপরের ফাংশনটি যা করে তা হ'ল সমস্ত সদস্যকে সূচক পর্যন্ত নিয়ে যাওয়া হয় এবং সূচকের পরে সমস্ত সদস্যকে নিয়ে যায় এবং তাদের একত্রে সম্মিলিত করে ফলাফলটি প্রদান করে।

এখানে নোড মডিউল হিসাবে ফাংশনটি ব্যবহার করে একটি উদাহরণ দেওয়া হচ্ছে, টার্মিনালটি দেখে দরকারী হবে:

> var arr = ["a","b","c","d"]
> arr
[ 'a', 'b', 'c', 'd' ]
> arr.length
4 
> var arrayRemoveIndex = require("./lib/array_remove_index");
> var newArray = arrayRemoveIndex(arr,arr.indexOf('c'))
> newArray
[ 'a', 'b', 'd' ] // c ya later
> newArray.length
3

দয়া করে নোট করুন যে এটিতে দু'দলের সাথে এটির জন্য একটি অ্যারেও কাজ করবে না, কারণ সূচিপত্র ("সি") সবেমাত্র প্রথম ঘটনাটি পাবে এবং এটি কেবল খুঁজে পাওয়া প্রথম "সি" সরিয়ে ফেলবে।


6

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

আপনি এটি একটি নতুন অ্যারে তৈরি করে করতে পারেন। যেমন

function reindexArray( array )
{
       var result = [];
        for( var key in array )
                result.push( array[key] );
        return result;
};

তবে আমি মনে করি না আপনি মূল অ্যারেতে মূল মানগুলি সংশোধন করতে পারবেন যা আরও কার্যকর হবে - দেখে মনে হচ্ছে আপনাকে একটি নতুন অ্যারে তৈরি করতে হবে।

নোট করুন যে আপনার "অপরিজ্ঞাত" এন্ট্রিগুলি পরীক্ষা করার প্রয়োজন নেই কারণ সেগুলি আসলে বিদ্যমান নেই এবং লুপের জন্য এগুলি তাদের ফিরিয়ে দেয় না। এটি অ্যারে মুদ্রণের একটি নিদর্শন যা এগুলি অপরিজ্ঞাত হিসাবে প্রদর্শন করে। এগুলি স্মৃতিতে বিদ্যমান বলে মনে হয় না।

আপনি যদি স্লাইস () এর মতো এমন কিছু ব্যবহার করতে পারেন যা দ্রুত হয় তবে এটি পুনরায় সূচী করে না nice কেউ কি আরও ভাল উপায় জানেন?


প্রকৃতপক্ষে, আপনি সম্ভবত এটি নিম্নলিখিত জায়গায় এটি করতে পারেন যা সম্ভবত আরও দক্ষ, কর্মক্ষমতা ভিত্তিক:

reindexArray : function( array )
{
    var index = 0;                          // The index where the element should be
    for( var key in array )                 // Iterate the array
    {
        if( parseInt( key ) !== index )     // If the element is out of sequence
        {
            array[index] = array[key];      // Move it to the correct, earlier position in the array
            ++index;                        // Update the index
        }
    }

    array.splice( index );  // Remove any remaining elements (These will be duplicates of earlier items)
},

আমি বিশ্বাস করি ++ সূচক; 'if' এর বাইরে হওয়া দরকার। সম্পাদনা করা হচ্ছে
মিসাল153

6

আপনি এই জাতীয় কিছু ব্যবহার করতে পারেন

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]


এটি sliceযদি আপনি কোনও কার্যকরী ব্যাকগ্রাউন্ড থেকে আসে (তবে সম্ভবত কম দক্ষ) তবে এটি আরও স্বজ্ঞাত ।
জেথ্রো

3

শুধু ফিল্টার না কেন? আমি মনে করি এটি জেএসে অ্যারেগুলি বিবেচনা করার সবচেয়ে সুস্পষ্ট উপায়।

myArray = myArray.filter(function(item){
    return item.anProperty != whoShouldBeDeleted
});

শতগুলি (হাজার হাজার না হলে) রেকর্ড সহ এমন অ্যারে সম্পর্কে কী যেখানে কেবলমাত্র 3 টি অপসারণ করা দরকার?
জোয়েল হার্নান্দেজ

ভাল যুক্তি. আমি স্পার্স অ্যারেগুলির জন্য এই পদ্ধতিটি ব্যবহার করি যার দৈর্ঘ্য 200 বা 300 এর বেশি নয় এবং খুব ভাল সম্পাদন করে। তবে আমি মনে করি যে যদি আপনার আরও বৃহত্তর অ্যারেগুলি পরিচালনা করতে হয় তবে আন্ডারলাইনের মতো লাইব্রেরিগুলিকে পছন্দ করা উচিত।
আসকান

1
তবে এটি আমার কাছে deleteবা sliceআমার চেয়ে অনেক সুন্দর লাগছে ।
জুনিয়উং ওহ

3

deleteঅপারেটর এবং splice()পদ্ধতি প্রয়োগ করার পরে প্রতিটি অ্যারের দৈর্ঘ্য লগ করে পার্থক্যটি দেখা যায় । উদাহরণ স্বরূপ:

অপারেটর মুছুন

var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
delete trees[3];

console.log(trees); // ["redwood", "bay", "cedar", empty, "maple"]
console.log(trees.length); // 5

deleteঅপারেটর অ্যারে থেকে উপাদান সরিয়ে ফেলা হবে, কিন্তু উপাদান "স্থানধারক" এখনও বিদ্যমান। oakসরানো হয়েছে তবে এটি অ্যারেতে জায়গা নেয়। এ কারণে অ্যারের দৈর্ঘ্য 5 থেকে যায়।

স্প্লাইস () পদ্ধতি

var trees = ['redwood', 'bay', 'cedar', 'oak', 'maple'];
trees.splice(3,1);

console.log(trees); // ["redwood", "bay", "cedar", "maple"]
console.log(trees.length); // 4

splice()পদ্ধতি সম্পূর্ণরূপে লক্ষ্য মান সরিয়ে ফেলা হবে এবং পাশাপাশি "স্থানধারক"। oakঅ্যারে দখল করতে ব্যবহৃত স্থানের পাশাপাশি সেই স্থানটি সরিয়ে ফেলা হয়েছে। অ্যারের দৈর্ঘ্য এখন 4।


2
function remove_array_value(array, value) {
    var index = array.indexOf(value);
    if (index >= 0) {
        array.splice(index, 1);
        reindex_array(array);
    }
}
function reindex_array(array) {
   var result = [];
    for (var key in array) {
        result.push(array[key]);
    }
    return result;
}

উদাহরণ:

var example_arr = ['apple', 'banana', 'lemon'];   // length = 3
remove_array_value(example_arr, 'banana');

কলা মুছে ফেলা হয় এবং অ্যারের দৈর্ঘ্য = 2


2

তারা বিভিন্ন জিনিস যার বিভিন্ন উদ্দেশ্য রয়েছে।

spliceঅ্যারে-নির্দিষ্ট এবং যখন মুছে ফেলার জন্য ব্যবহৃত হয়, অ্যারে থেকে এন্ট্রিগুলি সরিয়ে দেয় এবং পূর্ববর্তী সমস্ত এন্ট্রিগুলি শূন্যস্থান পূরণের জন্য সরিয়ে দেয়। (। এছাড়া এন্ট্রি সন্নিবেশ করতে, অথবা উভয় একই সময়ে ব্যবহার করা যেতে পারে) spliceপরিবর্তন করতে হবে lengthঅ্যারের (অভিমানী এটি একটি নো-অপ কল না: theArray.splice(x, 0))।

deleteঅ্যারে-নির্দিষ্ট নয়; এটি অবজেক্টগুলিতে ব্যবহারের জন্য ডিজাইন করা হয়েছে: এটি আপনি যে বস্তুর উপরে ব্যবহার করেন তার একটি সম্পত্তি (কী / মান জুটি) সরিয়ে দেয়। এটি কেবল অ্যারেগুলিতেই প্রযোজ্য কারণ জাভাস্ক্রিপ্টে স্ট্যান্ডার্ড (উদাহরণস্বরূপ, টাইপবিহীন) অ্যারেগুলি আসলে কোনও অ্যারে নয় *, তারা নির্দিষ্ট বৈশিষ্ট্যগুলির জন্য বিশেষ হ্যান্ডলিং সহ অবজেক্টস, যেমন যাদের নামগুলি "অ্যারে সূচকগুলি" (যা স্ট্রিং নাম হিসাবে সংজ্ঞায়িত "... যার সংখ্যার মান iপরিসীমা +0 ≤ i < 2^32-1") এবং length। আপনি যখন deleteঅ্যারে এন্ট্রি অপসারণ করতে ব্যবহার করেন, এটি সমস্ত হ'ল এন্ট্রি সরান; শূন্যস্থান পূরণের জন্য এটি অনুসরণ করে অন্যান্য এন্ট্রিগুলিকে সরায় না এবং তাই অ্যারেটি "স্পার্স" হয়ে যায় (কিছু প্রবেশিকা সম্পূর্ণরূপে অনুপস্থিত)। এটির কোনও প্রভাব নেই length

এই প্রশ্নের বর্তমান কয়েকটি উত্তর ভুলভাবে লিখেছেন যে delete"এন্ট্রি সেট করে " ব্যবহার করে undefined। এটি সঠিক নয়। এটি একটি ফাঁক রেখে পুরোপুরি প্রবেশ (সম্পত্তি) সরিয়ে দেয়

পার্থক্যগুলি চিত্রিত করতে কিছু কোড ব্যবহার করুন:

console.log("Using `splice`:");
var a = ["a", "b", "c", "d", "e"];
console.log(a.length);            // 5
a.splice(0, 1);
console.log(a.length);            // 4
console.log(a[0]);                // "b"

console.log("Using `delete`");
var a = ["a", "b", "c", "d", "e"];
console.log(a.length);            // 5
delete a[0];
console.log(a.length);            // still 5
console.log(a[0]);                // undefined
console.log("0" in a);            // false
console.log(a.hasOwnProperty(0)); // false

console.log("Setting to `undefined`");
var a = ["a", "b", "c", "d", "e"];
console.log(a.length);            // 5
a[0] = undefined;
console.log(a.length);            // still 5
console.log(a[0]);                // undefined
console.log("0" in a);            // true
console.log(a.hasOwnProperty(0)); // true


* (এটি আমার অ্যানিমিক ছোট্ট ব্লগের একটি পোস্ট)


2

বর্তমানে এটি করার দুটি উপায় রয়েছে

  1. স্প্লাইস ব্যবহার করে ()

    arrayObject.splice(index, 1);

  2. মুছে ফেলা ব্যবহার

    delete arrayObject[index];

তবে আমি সর্বদা অ্যারে অবজেক্টগুলির জন্য স্প্লাইস ব্যবহার এবং অবজেক্ট বৈশিষ্ট্যের জন্য মুছতে পরামর্শ দিই কারণ মুছুন অ্যারে দৈর্ঘ্য আপডেট করে না।


1

ঠিক আছে, কল্পনা করুন আমাদের নীচে এই অ্যারে রয়েছে:

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

প্রথমে মুছুন:

delete arr[1];

এবং এই ফলাফল:

[1, empty, 3, 4, 5];

খালি! এবং আসুন:

arr[1]; //undefined

সুতরাং কেবলমাত্র মানটি মুছে ফেলা হয়েছে এবং এটি এখন অপরিজ্ঞাত , সুতরাং দৈর্ঘ্য একই, এটিও সত্য ফিরে আসবে ...

আসুন আমাদের অ্যারেটি পুনরায় সেট করুন এবং এবার স্প্লাইস দিয়ে এটি করুন:

arr.splice(1, 1);

এবং এটি এই বার ফলাফল:

[1, 3, 4, 5];

আপনি দেখুন অ্যারের দৈর্ঘ্য পরিবর্তন arr[1]হয় 3 এখন ...

এছাড়াও এটি মুছে ফেলা আইটেমটিকে একটি অ্যারেতে ফিরিয়ে দেবে যা [3]এই ক্ষেত্রে ...


1

অন্যরা ইতিমধ্যে সঠিকভাবে তুলনা deleteকরেছে splice

আর একটি আকর্ষণীয় তুলনা deleteবনাম undefined: একটি মুছে ফেলা অ্যারে আইটেমটি কেবল সেট করা আছে তার চেয়ে কম মেমরি ব্যবহার করে undefined;

উদাহরণস্বরূপ, এই কোডটি শেষ করবে না:

let y = 1;
let ary = [];
console.log("Fatal Error Coming Soon");
while (y < 4294967295)
{
    ary.push(y);
    ary[y] = undefined;
    y += 1;
}
console(ary.length);

এটি এই ত্রুটি তৈরি করে:

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory.

সুতরাং, আপনি দেখতে পাচ্ছেন যে undefinedআসলে হিপ মেমরি লাগে।

তবে, আপনি যদি deleteঅ্যারি-আইটেমটিও (কেবল এটি সেট করার পরিবর্তে undefined) করেন তবে কোডটি আস্তে আস্তে শেষ হবে:

let x = 1;
let ary = [];
console.log("This will take a while, but it will eventually finish successfully.");
while (x < 4294967295)
{
    ary.push(x);
    ary[x] = undefined;
    delete ary[x];
    x += 1;
}
console.log(`Success, array-length: ${ary.length}.`);

এগুলি চরম উদাহরণ, তবে তারা এ সম্পর্কে একটি বক্তব্য রাখে deleteযে আমি কোথাও কাউকে উল্লেখ করতে দেখিনি।


1

আপনার যদি ছোট অ্যারে থাকে তবে আপনি ব্যবহার করতে পারেন filter:

myArray = ['a', 'b', 'c', 'd'];
myArray = myArray.filter(x => x !== 'b');

0

সবচেয়ে সহজ উপায় সম্ভবত

var myArray = ['a', 'b', 'c', 'd'];
delete myArray[1]; // ['a', undefined, 'c', 'd']. Then use lodash compact method to remove false, null, 0, "", undefined and NaN
myArray = _.compact(myArray); ['a', 'c', 'd'];

আশাকরি এটা সাহায্য করবে. তথ্যসূত্র: https://lodash.com/docs#compact


1
কেউ কি এই নিয়ে compactভাবছে যে হোঁচট খাচ্ছে ... লোডাশের দরকার নেই। চেষ্টা করুনmyArray.filter(function(n){return n;})
ডট

0

যারা লোডাশ ব্যবহার করতে চান তাদের জন্য: myArray = _.without(myArray, itemToRemove)

বা হিসাবে আমি Angular2 ব্যবহার করি

import { without } from 'lodash';
...
myArray = without(myArray, itemToRemove);
...

0

মুছুন : মুছুন বস্তুর সম্পত্তি মুছে ফেলবে, তবে অ্যারেটিকে পুনরায় সূচি দেবে না বা তার দৈর্ঘ্য আপডেট করবে না। এটি এটিকে এমনভাবে উপস্থিত করে তোলে যেন এটি অপরিজ্ঞাত:

স্প্লাইস : আসলে উপাদানটি সরিয়ে দেয়, অ্যারের সাথে পুনরায় সূচি দেয় এবং এর দৈর্ঘ্য পরিবর্তন করে।

শেষ থেকে উপাদান মুছুন

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

0

যদি মুছতে পছন্দসই উপাদানটি মাঝখানে থাকে (বলুন যে আমরা 'সি' মুছতে চাই, যা এর সূচকটি 1), আপনি ব্যবহার করতে পারেন:

var arr = ['a','b','c'];
var indexToDelete = 1;
var newArray = arr.slice(0,indexToDelete).combine(arr.slice(indexToDelete+1, arr.length))

0

IndexOfএকটি রেফারেন্স টাইপ গ্রহণ করে। ধরুন নিম্নলিখিত পরিস্থিতিতে:

var arr = [{item: 1}, {item: 2}, {item: 3}];
var found = find(2, 3); //pseudo code: will return [{item: 2}, {item:3}]
var l = found.length;

while(l--) {
   var index = arr.indexOf(found[l])
      arr.splice(index, 1);
   }
   
console.log(arr.length); //1

ভিন্নভাবে:

var item2 = findUnique(2); //will return {item: 2}
var l = arr.length;
var found = false;
  while(!found && l--) {
  found = arr[l] === item2;
}

console.log(l, arr[l]);// l is index, arr[l] is the item you look for

-1
function deleteFromArray(array, indexToDelete){
  var remain = new Array();
  for(var i in array){
    if(array[i] == indexToDelete){
      continue;
    }
    remain.push(array[i]);
  }
  return remain;
}

myArray = ['a', 'b', 'c', 'd'];
deleteFromArray(myArray , 0);

// ফলাফল: আমারআর্য = ['বি', 'সি', 'ডি'];


@ ক্রিসডেনিস কেন? (কোনও বিদ্রূপ বা কুৎসিত উদ্দেশ্য নয়, এটি আন্তরিক প্রশ্ন)
ক্রিস বিয়ার

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