জাভাস্ক্রিপ্টের একটি অ্যারে থেকে খালি উপাদানগুলি সরান


1143

আমি কীভাবে জাভাস্ক্রিপ্টের অ্যারে থেকে খালি উপাদানগুলি সরিয়ে ফেলব?

সোজা উপায় আছে কি, বা আমার এটির মধ্য দিয়ে লুপ নেওয়ার এবং সেগুলি ম্যানুয়ালি সরানোর দরকার আছে?


14
যদি আপনার প্রশ্নটি "খালি উপাদান" দ্বারা ঠিক কী বোঝায় তবে এটি সহায়ক হবে কারণ এখানে বেশিরভাগ উত্তরই "মিথ্যা" উপাদানগুলির অর্থ ভুলভাবে (আইএমএইচও) ব্যাখ্যা করে। বিশেষ দ্রষ্টব্য: তোমার জন্য কি পেতে মধ্যে একটি পার্থক্য আছে var a = [,,]এবং var a = [undefined, undefined]। পূর্ববর্তীটি সত্যই শূন্য, তবে পরবর্তীটির কাছে দুটি কী রয়েছে তবে undefinedমান সহ।
আলনিটাক

উত্তর:


1063

সম্পাদনা: প্রায় নয় বছর আগে এই প্রশ্নের উত্তর দেওয়া হয়েছিল যখন সেখানে কোনও কার্যকর অন্তর্নির্মিত পদ্ধতি ছিল না Array.prototype

এখন, অবশ্যই, আমি আপনাকে filterপদ্ধতিটি ব্যবহার করার পরামর্শ দিচ্ছি ।

মনে রাখবেন যে এই পদ্ধতিটি আপনাকে এমন উপাদানগুলির সাথে একটি নতুন অ্যারে ফিরিয়ে দেবে যা আপনি প্রদত্ত কলব্যাক ফাংশনের মানদণ্ডটি পাস করে।

উদাহরণস্বরূপ, আপনি যদি মুছে ফেলতে চান nullবা undefinedমানগুলি চান:

var array = [0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,,];

var filtered = array.filter(function (el) {
  return el != null;
});

console.log(filtered);

এটি আপনার "খালি" হিসাবে বিবেচনা করে তার উপর নির্ভর করবে উদাহরণস্বরূপ, আপনি যদি স্ট্রিং নিয়ে কাজ করে থাকেন তবে উপরের ফাংশনটি খালি স্ট্রিংয়ের উপাদানগুলি সরিয়ে ফেলবে না।

এক টিপিক্যাল প্যাটার্ন যে আমি প্রায়ই ব্যবহার করা দেখুন উপাদান আছে যা হয় অপসারণ করা হয় falsy , যা একটি খালি স্ট্রিং অন্তর্ভুক্ত "", 0, NaN, null, undefined, এবং false

আপনি filterপদ্ধতিতে, Booleanকনস্ট্রাক্টর ফাংশনে যেতে পারেন বা ফিল্টার মানদণ্ডের কার্যক্রমে একই উপাদানটি ফিরে আসতে পারেন, উদাহরণস্বরূপ:

var filtered = array.filter(Boolean);

অথবা

var filtered = array.filter(function(el) { return el; });

উভয় উপায়েই, এটি কাজ করে কারণ filterপ্রথম ক্ষেত্রে পদ্ধতিটি Booleanকনস্ট্রাক্টরকে একটি ফাংশন হিসাবে ডাকে , মান রূপান্তর করে এবং দ্বিতীয় ক্ষেত্রে, filterপদ্ধতিটি অভ্যন্তরীণভাবে কলব্যাকের ফেরতের মানকে অন্তর্নিহিতভাবে রূপান্তর করে Boolean

যদি আপনি স্পার্স অ্যারে নিয়ে কাজ করছেন এবং আপনি "গর্তগুলি" থেকে মুক্তি পাওয়ার চেষ্টা করছেন, আপনি filterকলব্যাক পাস করার পদ্ধতিটি ব্যবহার করতে পারেন যা সত্য ফিরে আসে, উদাহরণস্বরূপ:

var sparseArray = [0, , , 1, , , , , 2, , , , 3],
    cleanArray = sparseArray.filter(function () { return true });

console.log(cleanArray); // [ 0, 1, 2, 3 ]

পুরানো উত্তর: এটি করবেন না!

আমি দেশী অ্যারে প্রোটোটাইপ প্রসারিত করে এই পদ্ধতিটি ব্যবহার করি:

Array.prototype.clean = function(deleteValue) {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == deleteValue) {         
      this.splice(i, 1);
      i--;
    }
  }
  return this;
};

test = new Array("", "One", "Two", "", "Three", "", "Four").clean("");
test2 = [1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,];
test2.clean(undefined);

অথবা আপনি কেবল বিদ্যমান উপাদানগুলিকে অন্য অ্যারেতে ঠেলাতে পারেন:

// Will remove all falsy values: undefined, null, 0, false, NaN and "" (empty string)
function cleanArray(actual) {
  var newArray = new Array();
  for (var i = 0; i < actual.length; i++) {
    if (actual[i]) {
      newArray.push(actual[i]);
    }
  }
  return newArray;
}

cleanArray([1, 2,, 3,, 3,,,,,, 4,, 4,, 5,, 6,,,,]);

110
সতর্কতা: 2 য় বিকল্পটি "মিথ্যা" হিসাবে বিবেচিত অ্যারে থেকে যে কোনও উপাদান সরিয়ে ফেলবে, অর্থাত্ মিথ্যা, 0, নাল এবং অপরিজ্ঞাত মান। এই অ্যারেটিতে কিছু না হলেও শেষ হবে: [নাল ,,,, 0, 0,0,0, মিথ্যা, নাল, 0] যদিও আমি 0 টির মান সহ এই অ্যারেটির মতো উপাদানগুলি পেতে চাই: [ 1,0,1,0,0,1]
জেসন

5
আমি বুঝতে পারি - তাই আমি কেবল দ্বিতীয় বিকল্পের কথা বলেছিলাম। প্রথমটির হিসাবে, এটি স্কোপটিতে এতটাই সংকীর্ণ যে আমি এটিকে অ্যারের প্রোটোটাইপের অংশ হিসাবে তৈরি করতে ইতস্তত করব। আরও আদর্শ হতে পারে এমন কোনও কিছুর জন্য এই পৃষ্ঠায় অ্যালনিটকের উত্তর দেখুন। আপনার যদিও শৃঙ্খলার অনুমতি দেয়, স্পষ্টতই।
জেসন বুটিং

1
আপনার যদি "ফিল্টার" পদ্ধতিতে অ্যাক্সেস না পান তবে আপনার প্রথম সমাধানটি সত্যিই দুর্দান্ত। অন্যথায় আমি বিশ্বাস করি অ্যালনিটকের উত্তর আরও ভাল।
জো পাইনেদা

2
@ আলফাটেক - নতুন ব্রাউজারগুলি বাদে # 2 এর সেরা পারফরম্যান্স হবে, কারণ জেএসে অ্যারেগুলি সত্যই অ্যারে হয় না। spliceকল সত্যিই পুরোনো ব্রাউজারে ব্যয়বহুল কারণ তারা ফাঁক আপ বন্ধ করতে অ্যারে কি সব পুনরায় নম্বর আছে।
Alnitak

1
@ ডেভিড নং, আধুনিক কোডে আপনার নতুন ফাংশনটিকে একটি অ-গণ্যযোগ্য সম্পত্তি হিসাবে ব্যবহার করে নিরাপদে প্রসারিত Array.prototypeকরা উচিত এবং তারপরে প্রতিটি লুপের ফলে কার্যকর পারফরম্যান্স হিট এড়ানো উচিত । Object.defineProperty.hasOwnProperty
Alnitak

1380

সহজ উপায়ে:

var arr = [1,2,,3,,-3,null,,0,,undefined,4,,4,,5,,6,,,,];


arr.filter(n => n)
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Number) 
// [1, 2, 3, -3, 4, 4, 5, 6]

arr.filter(Boolean) 
// [1, 2, 3, -3, 4, 4, 5, 6]

বা - (কেবলমাত্র "পাঠ্য" টাইপের একক অ্যারে আইটেমের জন্য)

['','1','2',3,,'4',,undefined,,,'5'].join('').split(''); 
// output:  ["1","2","3","4","5"]

বা - ক্লাসিক উপায়: সাধারণ পুনরাবৃত্তি

var arr = [1,2,null, undefined,3,,3,,,0,,,[],,{},,5,,6,,,,],
    len = arr.length, i;

for(i = 0; i < len; i++ )
    arr[i] && arr.push(arr[i]);  // copy non-empty values to the end of the array

arr.splice(0 , len);  // cut the array and leave only the non-empty values

arr // [1,2,3,3,[],Object{},5,6]


jQuery মাধ্যমে:

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

arr = $.grep(arr,function(n){ return n == 0 || n });

arr // [1, 2, 3, 3, 0, 4, 4, 5, 6]


আপডেট - আরও একটি দ্রুত, শীতল উপায় (ES6 ব্যবহার করে):

var arr = [1,2,null, undefined,3,,3,,,0,,,4,,4,,5,,6,,,,], 
    temp = [];

for(let i of arr)
    i && temp.push(i); // copy each non-empty value to the 'temp' array

arr = temp;

arr // [1, 2, 3, 3, 4, 4, 5, 6]

খালি মানগুলি সরান

['foo', '',,,'',,null, ' ', 3, true, [], [1], {}, undefined, ()=>{}].filter(String)

// ["foo", null, " ", 3, true, [1], Object {}, undefined, ()=>{}]

34
ফিল্টারটির জন্য প্রথম দিকের IE সমর্থনটি IE9 মান মোড standards
ইঙ্ক্রাশ

14
খাঁটি জাভাস্ক্রিপ্টের জন্য এটি হওয়া উচিতarr = arr.filter(function(n){return n; });
ইলুমিন

19
foo.join("").split("")কেবল স্ট্রিংগুলি একক অক্ষর হলে কাজ করবে বলে মনে হচ্ছে
আতভা 32

8
আপনার খাঁটি জাভাস্ক্রিপ্ট কোডটিতে একটি বাগ রয়েছে। অ্যারেতে যদি "0" এর সাথে মান থাকে তবে মানটি ফিল্টার করা হবে কারণ "0" মিথ্যা বলে। আপনি যা চান তা হ'ল: arr.filter (ফাংশন (n) {রিটার্ন (n! == অপরিজ্ঞাত && n! == নাল);});
জন কুর্লক

5
ES6 এটি আরও সহজতর arr.filter(e=>e)করতে পারে এবং এটি মানচিত্র, হ্রাস ইত্যাদি দ্বারা শৃঙ্খলাবদ্ধ হতে পারে
শেপি

241

আপনার যদি সমস্ত খালি মান ("", নাল, অপরিজ্ঞাত এবং 0) অপসারণ করতে হয়:

arr = arr.filter(function(e){return e}); 

খালি মান এবং লাইন ব্রেকগুলি সরাতে:

arr = arr.filter(function(e){ return e.replace(/(\r\n|\n|\r)/gm,"")});

উদাহরণ:

arr = ["hello",0,"",null,undefined,1,100," "]  
arr.filter(function(e){return e});

ফেরত দিন:

["hello", 1, 100, " "]

আপডেট (অ্যালনিটকের মন্তব্যের ভিত্তিতে)

কিছু পরিস্থিতিতে আপনি অ্যারেতে "0" রাখতে এবং অন্য কোনও কিছু (নাল, অপরিজ্ঞাত এবং "") মুছে ফেলতে চাইতে পারেন, এটি একটি উপায়:

arr.filter(function(e){ return e === 0 || e });

ফেরত দিন:

["hello", 0, 1, 100, " "]

হ্যাঁ এটি দুর্দান্ত কুউজ "" পাশাপাশি মুছে ফেলে।
ভ্লাদিমিরস

3
পরীক্ষা ফাংশনটি আরও কিছুটা স্পষ্ট হতে পারে:function(e){return !!e}
কোয়েন।

4
@ কোয়েন দয়া করে নোট করুন যে !!eএতে NaN (0 টির বিপরীতে) অন্তর্ভুক্ত থাকবে যা কোনটি e(0 এর মতো নয়)।
শেপি

আসলে যে প্রশ্নটি করা হয়েছিল তার উত্তর দেয় না।
Alnitak

2
বা ব্যবহার অপরিবর্তিত var myarr=[1, 2,, 3,, 3,undefined,,"",,0, 4,, 4,, 5,, 6,,,,].filter(Boolean);, "" এবং 0
মার্ক শুলথিস

134

কেবল একটি লাইনার:

[1, false, "", undefined, 2].filter(Boolean); // [1, 2]

অথবা ব্যবহার underscorejs.org :

_.filter([1, false, "", undefined, 2], Boolean); // [1, 2]
// or even:
_.compact([1, false, "", undefined, 2]); // [1, 2]

1
এটি সত্যিই দুর্দান্ত - যদিও আমার কাছে একটি নতুন প্রশ্ন রয়েছে: দেখে মনে হচ্ছে আপনি কোনও ক্লাসের নামটি একটি ফাংশন কল হিসাবে ব্যবহার করছেন - এটি কি টাইপকাস্টিং? আমি এটি আগে দেখিনি এবং আমি নিশ্চিত নই যে কেন পাসিং Booleanএকটি ফাংশন হিসাবে কাজ করে ...
অ্যান্ড্রু

8
যদি আপনি Booleanকোনও ফাংশন হিসাবে বিবেচনা করেন তবে এটি সহজেই ফিরে আসবে trueবা falseতার বদলে মানটি সত্য / মিথ্যা।
andlrc

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

@ এলিওটিটিসিএবল আমি এখানে এড়াতে যাচ্ছি (true).constructor === Boolean,। এবং তারপরে আমাকে বলুন যে আমরা জেএসে অন্য বিল্ড-ইনগুলির সাথে এটি করতে পারি কিনা। ।)) (অবশ্যই অন্যান্য 5 বিল্ড-ইন কনস্ট্রাকটর (স্ট্রিং, অ্যারে, বস্তু, ফাংশন, সংখ্যা)) excluted
andlrc

1
অ্যারেতে 0 এর মান থাকলে উভয়ই ব্যর্থ হবে
সাঁই রাম

129

যদি আপনি জাভাস্ক্রিপ্ট ১.6 বা তার পরে পেয়েছেন তবে আপনি Array.filterএকটি তুচ্ছ return trueকলব্যাক ফাংশন ব্যবহার করে ব্যবহার করতে পারেন , যেমন:

arr = arr.filter(function() { return true; });

যেহেতু .filterমূল অ্যারেটিতে অনুপস্থিত উপাদানগুলি স্বয়ংক্রিয়ভাবে এড়িয়ে যায়।

উপরে লিঙ্কিত MDN পৃষ্ঠায় filterজাভাস্ক্রিপ্ট দোভাষী যারা অফিসিয়াল সংস্করণ সমর্থন করে না তাদের ব্যবহার করা যেতে পারে এর একটি দুর্দান্ত ত্রুটি-পরীক্ষার সংস্করণ রয়েছে ।

দ্রষ্টব্য যে এটি nullকোনও সুস্পষ্ট undefinedমান সহ এন্ট্রিগুলি বা এন্ট্রিগুলিকে সরাবে না , তবে ওপি বিশেষত "অনুপস্থিত" এন্ট্রিগুলির জন্য অনুরোধ করেছে।


তুমি ঠিক বলছো! এটি এটির মতো সহজ (এবং কাজ করে!) হতে পারে: টেস্ট3 = [1,2,, 3,, 3 ,,,, 7 ,,, 7 ,,, 0 ,,, 4,, 4, 5% 6,, undefined ,, নাল ,,]; মুদ্রণ ("অ্যারের নেটিভ ফিল্টারিং ব্যবহার করে:", test3.filter (ফাংশন (মান) {রিটার্ন (মান == অপরিবর্তিত)? 0: 1;}));
জো পাইনেদা

3
+1 যেমন অ্যালনিটাক বলেছেন, তাদের কাছে কোড রয়েছে যা জেএস ১.6 না পাওয়া ক্ষেত্রে ব্যবহার করা যেতে পারে
সমীর আলিভাই

3
@ কাটশ আমি স্পষ্ট করে দিয়েছি - উপরের কোডটি এন্ট্রিগুলি সরিয়ে ফেলতে কাজ করে যার জন্য কোনও মানই নেই, যা (পরে আমি শিখেছি) কোনও কী-এর উপস্থিতির চেয়ে শব্দার্থগতভাবে আলাদা তবে undefinedএটির প্রদত্ত মান হিসাবে রয়েছে ।
Alnitak

4
অপরিশোধিত বা নাল এন্ট্রিগুলি সরাতে, কেবল একটি ছোট্ট পরিবর্তন করুন ... arr = arr.filter (ফাংশন (v) {রিটার্ন ভি;});
অ্যালান সিএন

4
@ অ্যালানসিএন আপনি আমার বক্তব্যটি পুরোপুরি মিস করেছেন। ওপি অনুপস্থিত এন্ট্রিগুলি অপসারণ করতে বলেছে , যদিও বেশিরভাগ উত্তর এখানে (ভুলভাবে) কোনও "মিথ্যা" এন্ট্রি মুছে ফেলবে।
Alnitak

65

গর্ত অপসারণ করার জন্য, আপনার ব্যবহার করা উচিত

arr.filter(() => true)
arr.flat(0) // Currently stage 3, check compatibility before using this

গর্ত, এবং, মিথ্যা (নাল, অপরিজ্ঞাত, 0, -0, NaN, "", মিথ্যা, দস্তাবেজ। সমস্ত) মানগুলি মুছে ফেলার জন্য:

arr.filter(x => x)

গর্ত, নাল এবং অপরিশোধিত অপসারণের জন্য:

arr.filter(x => x != null)

arr = [, null, (void 0), 0, -0, NaN, false, '', 42];
console.log(arr.filter(() => true)); // [null, (void 0), 0, -0, NaN, false, '', 42]
console.log(arr.filter(x => x)); // [42]
console.log(arr.filter(x => x != null)); // [0, -0, NaN, false, "", 42]


3
উত্তরের উচ্চতর হওয়া উচিত। আপনি গর্ত / গর্ত বলতে কী বোঝাতে চান তা বাড়িয়ে দিতে পারবেন ..?
সমায়ো

2
@ সামায়ো গর্তগুলি ভরাট অ্যারে আইটেমগুলি যেমন[, ,]
জিমি ওবনিও অ্যাবোর

ব্যবহার করে arr.filter(x => x), জেএস এক্স সত্যবাদী বা মিথ্যা কিনা তা পরীক্ষা করবে if (x), সুতরাং, কেবলমাত্র সত্যবাদী মান নতুন তালিকায় অর্পণ করা হবে।
কুয়ানইউ চু

56

এটি করার পরিষ্কার উপায়।

var arr = [0,1,2,"Thomas","false",false,true,null,3,4,undefined,5,"end"];
arr = arr.filter(Boolean);
// [1, 2, "Thomas", "false", true, 3, 4, 5, "end"]

5
খালি উপাদানগুলি হ'ল undefined; এটি মূলত সমস্ত মিথ্যা মানগুলি সরিয়ে দেয়।
pimvdb

33

সরল ES6

['a','b','',,,'w','b'].filter(v => v);

1
এই কাজ করে না: [1, 'two', null, undefined, , NaN, false, true, 0].filter(v => v)
জিপার

22

ইন্ডসকোর / লোডাশ সহ:

সাধারণ ব্যবহারের ক্ষেত্রে:

_.without(array, emptyVal, otherEmptyVal);
_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);

খালি সহ:

_.without(['foo', 'bar', '', 'baz', '', '', 'foobar'], '');
--> ["foo", "bar", "baz", "foobar"]

বিনা জন্য লোড্যাশ ডকুমেন্টেশন দেখুন ।


# কমপ্যাক্ট সহ সমস্যাটি হ'ল এটি কোনও মিথ্যা মানগুলি সরিয়ে দেয়। সুতরাং আপনার অ্যারেতে যদি 0 টি মান থাকে তবে সেগুলিও সরানো হবে।
স্যামুয়েল ব্র্যান্ডো

21

কেবলমাত্র ES6এবং আরও নতুন সংস্করণ পদ্ধতি, ধরে নিন অ্যারেটি নীচে রয়েছে:

 const arr = [1,2,3,undefined,4,5,6,undefined,7,8,undefined,undefined,0,9];

সহজ উপায়:

 const clearArray = arr.filter( i => i );

16

লাইব্রেরিটি ব্যবহার করা যদি একটি বিকল্প হয় তবে আমি জানি আন্ডারস্কোর.জেএস এর একটি কমপ্যাক্ট () http://docamentcloud.github.com/underscore/ নামে একটি ফাংশন রয়েছে এটিতে অ্যারে এবং সংগ্রহ সম্পর্কিত আরও কয়েকটি দরকারী কার্যকারিতা রয়েছে।

তাদের ডকুমেন্টেশনের একটি অংশ এখানে দেওয়া হয়েছে:

_.compact (অ্যারে)

সমস্ত মিথ্যা মানগুলি সরানো সহ অ্যারের একটি অনুলিপি ফেরত দেয়। জাভাস্ক্রিপ্টে, মিথ্যা, নাল, 0, "", অপরিজ্ঞাত এবং NaN সমস্ত মিথ্যা।

_কমপ্যাক্ট ([0, 1, ভুয়া, 2, '', 3]);

=> [১, ২, ৩]


এটি নন-খালি উপাদানগুলি সংজ্ঞায়িত উপাদানগুলিকে 0 এর
তীমথিয় গু

15

@Alnitak

আসলে আপনি যদি অতিরিক্ত কিছু কোড যুক্ত করেন তবে অ্যারে.ফিল্টার সমস্ত ব্রাউজারগুলিতে কাজ করে। নিচে দেখ.

var array = ["","one",0,"",null,0,1,2,4,"two"];

function isempty(x){
if(x!=="")
    return true;
}
var res = array.filter(isempty);
document.writeln(res.toJSONString());
// gives: ["one",0,null,0,1,2,4,"two"]  

এই আইডির জন্য আপনার কোড যুক্ত করতে হবে তবে ফিল্টার এবং ফাংশনাল প্রোগ্রামিং এর মূল্য ইমো।

//This prototype is provided by the Mozilla foundation and
//is distributed under the MIT license.
//http://www.ibiblio.org/pub/Linux/LICENSES/mit.license

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp*/)
  {
    var len = this.length;
    if (typeof fun != "function")
      throw new TypeError();

    var res = new Array();
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in this)
      {
        var val = this[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, this))
          res.push(val);
      }
    }

    return res;
  };
}

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত, কারণ এটি বাক্সের বাইরে কাজ করে। অনেক ধন্যবাদ.
টনি

@ টনি না, এটি করা উচিত নয়, কারণ এটিতে খালি স্ট্রিংযুক্ত একটি উপাদান একটি "খালি উপাদান" এর মতো নয়, ওপি যা চেয়েছিল তা পরবর্তীকালে।
Alnitak

14

যেহেতু অন্য কারও এটি উল্লেখ করা হয়নি এবং বেশিরভাগ লোকেরা তাদের প্রকল্পের মধ্যে আন্ডারস্কোর অন্তর্ভুক্ত করেছেন আপনি এটিও ব্যবহার করতে পারেন _.without(array, *values);

_.without(["text", "string", null, null, null, "text"], null)
// => ["text", "string", "text"]


8

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

আপনি এরকম কিছু করতে পারেন:

function removeFalsyElementsFromArray(someArray) {
    var newArray = [];
    for(var index = 0; index < someArray.length; index++) {
        if(someArray[index]) {
            newArray.push(someArray[index]);
        }
    }
    return newArray;
}

আসলে এখানে আরও জেনেরিক সমাধান:

function removeElementsFromArray(someArray, filter) {
    var newArray = [];
    for(var index = 0; index < someArray.length; index++) {
        if(filter(someArray[index]) == false) {
            newArray.push(someArray[index]);
        }
    }
    return newArray;
}

// then provide one or more filter functions that will 
// filter out the elements based on some condition:
function isNullOrUndefined(item) {
    return (item == null || typeof(item) == "undefined");
}

// then call the function like this:
var myArray = [1,2,,3,,3,,,,,,4,,4,,5,,6,,,,];
var results = removeElementsFromArray(myArray, isNullOrUndefined);

// results == [1,2,3,3,4,4,5,6]

আপনি ধারণাটি পান - আপনার তখন অন্য ধরণের ফিল্টার ফাংশন থাকতে পারে। সম্ভবত আপনার প্রয়োজনের চেয়ে বেশি, তবে আমি উদার বোধ করছিলাম ...;)


7

এটি সম্পর্কে কী (ES6): একটি অ্যারের থেকে মিথ্যা মান সরাতে।

var arr = [0,1,2,"test","false",false,true,null,3,4,undefined,5,"end"];

arr.filter((v) => (!!(v)==true));

//output:

//[1, 2, "test", "false", true, 3, 4, 5, "end"]

6

খালি উপাদান ছাড়াই অ্যারে পেতে আপনার ফিল্টার ব্যবহার করা উচিত। ES6 এর উদাহরণ

const array = [1, 32, 2, undefined, 3];
const newArray = array.filter(arr => arr);

3

আমি কেবল উপরের "ES5 এর ডাকতে আমার ভয়েস যোগ করছি Array..filter()একটি বিশ্বব্যাপী কন্সট্রাকটর সঙ্গে" গলফ-হ্যাক, কিন্তু আমি ব্যবহার করার পরামর্শ দিই Objectপরিবর্তে String, Booleanঅথবা Numberউপরের হিসাবে সুপারিশ করেছে।

বিশেষত, ইএস 5 এর filter()ইতিমধ্যে undefinedঅ্যারের মধ্যে থাকা উপাদানগুলির জন্য ট্রিগার করে না ; সুতরাং একটি ফাংশন যা সর্বজনীনভাবে ফিরে আসে true, যা সমস্ত উপাদানকে filter()হিট দেয়, অগত্যা কেবল অ- undefinedউপাদানগুলি ফেরত দেয় :

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(function(){return true})
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]

তবে লেখার ...(function(){return true;})চেয়ে লেখালেখি দীর্ঘতর ...(Object); এবং Objectকনস্ট্রাক্টরের রিটার্ন-মান হ'ল যে কোনও পরিস্থিতিতে , কোনও না কোনও অবজেক্ট। উপরে বর্ণিত আদিম-বক্সিং-নির্মাণকারীগণের বিপরীতে, কোনও সম্ভাব্য অবজেক্ট-মান মিথ্যা নয় এবং এইভাবে বুলিয়ান সেটিংয়ে এটির Objectজন্য স্বল্প হাত function(){return true}

> [1,,5,6,772,5,24,5,'abc',function(){},1,5,,3].filter(Object)
[1, 5, 6, 772, 5, 24, 5, 'abc', function (){}, 1, 5, 3]

1
সাবধান: ফিল্টার (স্ট্রিং) এবং ফিল্টার (অবজেক্ট) নাল বা সংখ্যাগুলি ফিল্টার করে না। কারণ কনস্ট্রাক্টর এমন একটি ফাংশন যা আপনি স্ট্রিংকে ফিল্টার করতে পারবেন অর্থাত্ এর someArray.filter(String);সমতুল্য someArray.filter(function(x){ return String(x); });। আপনি যদি সমস্ত মিথ্যা মানগুলি মুছতে চান someArray.filter(Boolean);তবে 0, -0, NaN, মিথ্যা, '', নাল এবং অপরিজ্ঞাত অপসারণ করতে কাজ করে।
রোবোকট

1
চমৎকার উত্তর, যদিও আমি পদ্ধতির Objectবিপরীতে কনস্ট্রাক্টরকে কল করার পারফরম্যান্সের ওভারহেড সম্পর্কে অবাক হয়েছি return true। @ আরবোক্যাট ওপি শূন্য উপাদানগুলিকে অপসারণের জন্য, খালি উপাদানগুলি অপসারণের জন্য বলেছে।
Alnitak

আমি টাইট-লুপগুলি বাদে সবচেয়ে সংক্ষিপ্ত এবং পরিষ্কার, সমাধানটি পছন্দ করি। আমি মনে করি ব্যক্তিগত পছন্দ। (=
এলিওটিটিসিবল

3

উপরের সর্বোচ্চ ভোট দেওয়া উত্তরটি ব্যবহার করার সময়, উদাহরণস্বরূপ, আমি স্ট্রিং দৈর্ঘ্যের জন্য পৃথক অক্ষর পাচ্ছিলাম 1 এর চেয়ে বেশি।

var stringObject = ["", "some string yay", "", "", "Other string yay"];
stringObject = stringObject.filter(function(n){ return n.length > 0});

অপরিবর্তিত থাকলে ফিরে না আসার পরিবর্তে দৈর্ঘ্য ০ এর চেয়ে বেশি হলে আমরা ফিরে আসি Hope আশা করি সেখানকার কাউকে সাহায্য করবে।

রিটার্নস

["some string yay", "Other string yay"]

+1 এটি অত্যন্ত ব্যবহারিক এবং হ'ল স্ট্রিং অ্যারেগুলির সাথে আমার সাধারণত যা কাজ করা প্রয়োজন তা ঠিক আছে তবে সচেতন থাকবেন যে এটি সংখ্যাগুলি সরিয়ে দেয় (যদি তারা স্ট্রিং আকারে না থাকে) যেহেতু তাদের কাছে একটি চ্যালেঞ্জ নেই, ["", "some string yay", "", "", 123, "Other string yay"].filter(function(n){ return n.length > 0}) //gives your same result removing 123সেই ফাংশনটি প্রতিস্থাপন করে। .. স্ট্রিং সহ, বিদ্রূপাত্মকভাবে, সংখ্যাগুলি ছেড়ে দেয় তবে আপনার প্রদত্ত অ্যারেতে একই ফলাফল দেবে।
এমার্কস


2

ওটা সম্পর্কে কি:

js> [1,2,,3,,3,,,0,,,4,,4,,5,,6,,,,].filter(String).join(',')
1,2,3,3,0,4,4,5,6

6
join() === join(','):)
pimvdb

1

এটি কাজ করে, আমি এটিকে অ্যাপজেটে পরীক্ষা করেছি (আপনি কোডটি তার আইডিইতে কপি-পেস্ট করতে পারেন এবং এটি কাজ করতে দেখতে "পুনরায় লোড করুন" টিপুন, অ্যাকাউন্ট তৈরি করার দরকার নেই)

/* appjet:version 0.1 */
function Joes_remove(someArray) {
    var newArray = [];
    var element;
    for( element in someArray){
        if(someArray[element]!=undefined ) {
            newArray.push(someArray[element]);
        }
    }
    return newArray;
}

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

print("Original array:", myArray2);
print("Clenased array:", Joes_remove(myArray2) );
/*
Returns: [1,2,3,3,0,4,4,5,6]
*/

1
এটি কেবল "দুর্ঘটনাক্রমে" কাজ করে বলে মনে হচ্ছে, যেহেতু এটি কীগুলির মাধ্যমে কীগুলি গণনা করার কাজটি for ... inআসলে অনুপস্থিত উপাদানগুলির এড়িয়ে যাওয়ার কারণ হয়ে দাঁড়ায়। undefinedকেবলমাত্র পরীক্ষাটি সেই প্রকৃত উপাদানগুলি সরিয়ে দেয় যা স্পষ্টভাবে সেই মানটিতে সেট করা থাকে।
অ্যালনিটাক

1

এটি করার আরেকটি উপায় হ'ল অ্যারের দৈর্ঘ্যের সম্পত্তিটি গ্রহণ করা: অ্যারের 'বামে' নন-নাল আইটেমগুলি প্যাক করুন, তারপরে দৈর্ঘ্য হ্রাস করুন। এটি একটি স্থানের অ্যালগরিদম - মেমরি বরাদ্দ না করে, আবর্জনা সংগ্রাহকের পক্ষে খুব খারাপ, এবং এটির খুব ভাল / গড় / সবচেয়ে খারাপ ক্ষেত্রে আচরণ রয়েছে।

এই সমাধানটি এখানে অন্যদের তুলনায়, ক্রোমে 2 থেকে 50 গুণ দ্রুত এবং ফায়ারফক্সে 5 থেকে 50 গুণ দ্রুততর, আপনি এখানে দেখতে পাচ্ছেন: http://jsperf.com/remove-null-items-from-array

নীচের কোডটি অ্যারেতে অ-গণনাযোগ্য 'সরাননুল' পদ্ধতি যুক্ত করে, যা ডেইজি-শৃঙ্খলার জন্য 'এই' ফিরিয়ে দেয়:

var removeNull = function() {
    var nullCount = 0           ;
    var length    = this.length ;
    for (var i=0, len=this.length; i<len; i++) { if (!this[i]) {nullCount++} }
    // no item is null
    if (!nullCount) { return this}
    // all items are null
    if (nullCount == length) { this.length = 0; return this }
    // mix of null // non-null
    var idest=0, isrc=length-1;
    length -= nullCount ;                
    while (true) {
         // find a non null (source) slot on the right
         while (!this[isrc])  { isrc--; nullCount--; } 
         if    (!nullCount) { break }       // break if found all null
         // find one null slot on the left (destination)
         while ( this[idest]) { idest++  }  
         // perform copy
         this[idest]=this[isrc];
         if (!(--nullCount)) {break}
         idest++;  isrc --; 
    }
    this.length=length; 
    return this;
};  

Object.defineProperty(Array.prototype, 'removeNull', 
                { value : removeNull, writable : true, configurable : true } ) ;

উত্তম উত্তর, যদিও এটি পরীক্ষার জন্য কিছু পরীক্ষার কেসগুলি দেখানো ভাল হবে!
Alnitak

2
এই উত্তরটি খুব চটুল কিন্তু ধরনের আমার 1945 সালে নির্মিত একটি কম্পিউটার এ খুঁজছেন মনে করিয়ে দেয় যখন আমি একটি স্মার্টফোন আছে: arr.filter(e => e)
agm1984

1
foo = [0, 1, 2, "", , false, 3, "four", null]

foo.filter(function(e) {
    return e === 0 ? '0' : e
})

আয়

[0, 1, 2, 3, "four"]

1

(অবজেক্ট-সদস্য) লুপের জন্য 'অপব্যবহার'। => লুপের শরীরে কেবল সত্যবাদী মানগুলি উপস্থিত হয়।

// --- Example ----------
var field = [];

field[0] = 'One';
field[1] = 1;
field[3] = true;
field[5] = 43.68;
field[7] = 'theLastElement';
// --- Example ----------

var originalLength;

// Store the length of the array.
originalLength = field.length;

for (var i in field) {
  // Attach the truthy values upon the end of the array. 
  field.push(field[i]);
}

// Delete the original range within the array so that
// only the new elements are preserved.
field.splice(0, originalLength);

কোডটি সঠিক, মন্তব্যটি ভুল। ব্যবহারের আইন for ... inকি অ্যারে থেকে অনির্ধারিত কী সরিয়ে ফেলা হবে, কিন্তু আপনি আসলে কোন কোড এখানে করেছি অন্যথায় কেবল "truthy" মান গ্রহণ করতে
ঊষা

1

এটি আপনাকে সাহায্য করতে পারে: https://lodash.com/docs/4.17.4# সরানো

var details = [
            {
                reference: 'ref-1',
                description: 'desc-1',
                price: 1
            }, {
                reference: '',
                description: '',
                price: ''
            }, {
                reference: 'ref-2',
                description: 'desc-2',
                price: 200
            }, {
                reference: 'ref-3',
                description: 'desc-3',
                price: 3
            }, {
                reference: '',
                description: '',
                price: ''
            }
        ];

        scope.removeEmptyDetails(details);
        expect(details.length).toEqual(3);

scope.removeEmptyDetails = function(details){
            _.remove(details, function(detail){
                return (_.isEmpty(detail.reference) && _.isEmpty(detail.description) && _.isEmpty(detail.price));
            });
        };

1
var data= { 
    myAction: function(array){
        return array.filter(function(el){
           return (el !== (undefined || null || ''));
        }).join(" ");
    }
}; 
var string = data.myAction(["I", "am","", "working", "", "on","", "nodejs", "" ]);
console.log(string);

আউটপুট:

আমি নোডেজে কাজ করছি

এটি অ্যারে থেকে খালি উপাদানটি সরিয়ে অন্য উপাদান প্রদর্শন করবে।


আউটপুট: 'আমি নোডেজ নিয়ে কাজ করছি'। এটি অ্যারে থেকে খালি উপাদানটি সরিয়ে অন্য উপাদান প্রদর্শন করবে।
জিতেন্দ্র বিরানী

আমি আপনার উত্তর উন্নত। দয়া করে সহজ, স্পষ্ট এবং পঠনযোগ্য উত্তর দেওয়ার চেষ্টা করুন;)
জিজিও

1

সমস্ত খালি উপাদান মুছে ফেলা হচ্ছে

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

const arr = [ [], ['not', 'empty'], {}, { key: 'value' }, 0, 1, null, 2, "", "here", " ", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ]

let filtered = JSON.stringify(
  arr.filter((obj) => {
    return ![null, undefined, ''].includes(obj)
  }).filter((el) => {
    return typeof el != "object" || Object.keys(el).length > 0
  })
)

console.log(JSON.parse(filtered))

সাধারণ কমপ্যাক্টিং (একটি অ্যারের থেকে খালি উপাদানগুলি সরিয়ে)

ES6 সহ:

const arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]

let filtered = arr.filter((obj) => { return ![null, undefined].includes(obj) })

console.log(filtered)

সরল জাভাস্ক্রিপ্ট সহ ->

var arr = [0, 1, null, 2, "", 3, undefined, 3, , , , , , 4, , 4, , 5, , 6, , , ,]

var filtered = arr.filter(function (obj) { return ![null, undefined].includes(obj) })

console.log(filtered)


0

একটি নিয়মিত অভিব্যক্তি দিয়ে অবৈধ এন্ট্রি ফিল্টারিং

array = array.filter(/\w/);
filter + regexp

এটা কি কাজ করে? এটি একটি ত্রুটি দেখায় TypeError: [অবজেক্ট RegExp] কোনও ফাংশন নয়
ফ্রিলাইটম্যান

0

খালি উপাদানগুলি অপসারণ করার সর্বোত্তম উপায় হ'ল ব্যবহার করা Array.prototype.filter(), যেমন ইতিমধ্যে অন্যান্য উত্তরে উল্লিখিত হয়েছে।

দুর্ভাগ্যক্রমে, Array.prototype.filter()আই <9 দ্বারা সমর্থিত নয়। আপনি যদি এখনও আইই 8 বা আইই এর আরও পুরানো সংস্করণ সমর্থন করতে চান তবে আপনি এই ব্রাউজারগুলিতে সমর্থন যোগ করতে নিম্নলিখিত পলফিলটি ব্যবহার করতে পারেন Array.prototype.filter():

if (!Array.prototype.filter) {
  Array.prototype.filter = function(fun/*, thisArg*/) {
    'use strict';
    if (this === void 0 || this === null) {
      throw new TypeError();
    }
    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== 'function') {
      throw new TypeError();
    }
    var res = [];
    var thisArg = arguments.length >= 2 ? arguments[1] : void 0;
    for (var i = 0; i < len; i++) {
      if (i in t) {
        var val = t[i];
        if (fun.call(thisArg, val, i, t)) {
          res.push(val);
        }
      }
    }
    return res;
  };
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.