ForEach লুপে অ্যারে থেকে উপাদান কীভাবে সরাবেন?


102

আমি forEachলুপের একটি অ্যারেতে একটি উপাদান সরিয়ে দেওয়ার চেষ্টা করছি , তবে আমি যে স্ট্যান্ডার্ড সমাধান দেখেছি তাতে সমস্যা হচ্ছে।

আমি বর্তমানে এটিই চেষ্টা করছি:

review.forEach(function(p){
   if(p === '\u2022 \u2022 \u2022'){
      console.log('YippeeeE!!!!!!!!!!!!!!!!')
      review.splice(p, 1);
   }
});

আমি জানি যে এটি ifকনসোলটিতে দেখছি কারণ এটি into YippeeeeeE!!!!!!!!!!!!!ুকছে।

আমার সমস্যা: আমি জানি যে আমার লুপের জন্য এবং যদি যুক্তিটি যথাযথ হয় তবে অ্যারের থেকে বর্তমান উপাদানটি সরিয়ে দেওয়ার আমার প্রচেষ্টা ব্যর্থ হচ্ছে।

হালনাগাদ:

Xotic750 এর উত্তর চেষ্টা করে দেখুন এবং এখনও উপাদানটি সরানো হচ্ছে না:

আমার কোডটিতে ফাংশনটি এখানে:

review.forEach(function (item, index, object) {
    if (item === '\u2022 \u2022 \u2022') {
       console.log('YippeeeE!!!!!!!!!!!!!!!!')
       object.splice(index, 1);
    }
    console.log('[' + item + ']');
});

এখানে আউটপুট যেখানে অ্যারে এখনও সরানো হয়নি:

[Scott McNeil]
[reviewed 4 months ago]
[ Mitsubishi is AMAZING!!!]
YippeeeE!!!!!!!!!!!!!!!!
[• • •]

সুতরাং স্পষ্টতই এটি নির্দেশিত হিসাবে যদি বিবৃতিতে যাচ্ছে, তবে এটিও স্পষ্ট যে [• • •] এখনও আছে।


8
আপনি ব্যবহার করছেন এমন কোনও কারণ আছে forEach? আপনি যদি আইটেমগুলি সরাতে চান তবে সর্বাধিক উপযুক্ত ফাংশন filter
জন

4
আপনার যদি মূল অ্যারেটির রেফারেন্স রাখতে হয় তবে তা নয়।
Xotic750

হ্যাঁ, আমরা মূল অ্যারের রেফারেন্স রাখতে চাই।
novicePrgrmr

আপনার প্রশ্ন থেকে এটি পরিষ্কার নয় যে আপনি যে আসল সমস্যাটি করছেন তা কী? আপনি একটি উদাহরণ দিতে পারেন, সম্ভবত একটি জেএসফিডাল? মনে হচ্ছে আপনি সম্ভবত ব্যবহার করা উচিত indexবদলে অ্যাট্রিবিউট itemআপনার জন্যsplice
Xotic750

@ Xotic750 দুঃখিত, যোগ করা হয়েছে স্পষ্টতা।
novicePrgrmr

উত্তর:


246

দেখে মনে হচ্ছে আপনি এটি করার চেষ্টা করছেন?

অ্যারে.প্রোটোটাইপ.স্প্লাইস ব্যবহার করে একটি অ্যারেটি পরিমার্জন করুন ate

var pre = document.getElementById('out');

function log(result) {
  pre.appendChild(document.createTextNode(result + '\n'));
}

var review = ['a', 'b', 'c', 'b', 'a'];

review.forEach(function(item, index, object) {
  if (item === 'a') {
    object.splice(index, 1);
  }
});

log(review);
<pre id="out"></pre>

কোন সরল ক্ষেত্রে আপনার পক্ষে সংলগ্ন অ্যারে আইটেমের মতো একই মানগুলির 2 নেই, অন্যথায় আপনার সমস্যা আছে।

var pre = document.getElementById('out');

function log(result) {
  pre.appendChild(document.createTextNode(result + '\n'));
}

var review = ['a', 'a', 'b', 'c', 'b', 'a', 'a'];

review.forEach(function(item, index, object) {
  if (item === 'a') {
    object.splice(index, 1);
  }
});

log(review);
<pre id="out"></pre>

সুতরাং পুনরাবৃত্তি এবং একটি অ্যারের পরিবর্তন করার সময় আমরা এই সমস্যাটি সম্পর্কে কী করতে পারি? ঠিক আছে সাধারণ সমাধানটি বিপরীতে কাজ করা। ES3 ব্যবহার করার সময় তবে আপনি চাইলে চিনির জন্য ব্যবহার করতে পারেন

var pre = document.getElementById('out');

function log(result) {
  pre.appendChild(document.createTextNode(result + '\n'));
}

var review = ['a' ,'a', 'b', 'c', 'b', 'a', 'a'],
  index = review.length - 1;

while (index >= 0) {
  if (review[index] === 'a') {
    review.splice(index, 1);
  }

  index -= 1;
}

log(review);
<pre id="out"></pre>

ঠিক আছে, তবে আপনি ES5 পুনরাবৃত্তি পদ্ধতিগুলি ব্যবহার করতে চেয়েছিলেন। ওয়েল এবং অপশনটি অ্যারে.প্রোটোটাইপ.ফিল্টার ব্যবহার করা হবে তবে এটি মূল অ্যারেটিকে রূপান্তরিত করে না তবে একটি নতুন তৈরি করে, যাতে আপনি সঠিক উত্তর পেতে পারলে এটি আপনাকে নির্দিষ্ট করে বলে মনে হয় না।

আমরা ES5 অ্যারে.প্রোটোটাইপ.ড্রেস রাইটও ব্যবহার করতে পারি , সম্পত্তি হ্রাস করার পরিবর্তে তার পুনরাবৃত্ত সম্পত্তি হিসাবে নয়, অর্থাৎ বিপরীতে পুনরাবৃত্তি করি।

var pre = document.getElementById('out');

function log(result) {
  pre.appendChild(document.createTextNode(result + '\n'));
}

var review = ['a', 'a', 'b', 'c', 'b', 'a', 'a'];

review.reduceRight(function(acc, item, index, object) {
  if (item === 'a') {
    object.splice(index, 1);
  }
}, []);

log(review);
<pre id="out"></pre>

অথবা আমরা ES5 অ্যারে.প্রোটোটাইপ.ইনডেক্সও পছন্দ করতে পারি।

var pre = document.getElementById('out');

function log(result) {
  pre.appendChild(document.createTextNode(result + '\n'));
}

var review = ['a', 'a', 'b', 'c', 'b', 'a', 'a'],
  index = review.indexOf('a');

while (index !== -1) {
  review.splice(index, 1);
  index = review.indexOf('a');
}

log(review);
<pre id="out"></pre>

তবে আপনি বিশেষত ES5 অ্যারে.প্রোটোটাইপ.এফ ব্যবহার করতে চান , তাই আমরা কী করতে পারি? ঠিক আছে আমাদের অ্যারে এবং অ্যারে.প্রোটোটাইপ.রেভারের অগভীর অনুলিপি তৈরি করতে অ্যারে.প্রোটোটাইপ.স্লাইস ব্যবহার করা উচিত যাতে আমরা মূল অ্যারেটি পরিবর্তন করতে বিপরীতে কাজ করতে পারি।

var pre = document.getElementById('out');

function log(result) {
  pre.appendChild(document.createTextNode(result + '\n'));
}

var review = ['a', 'a', 'b', 'c', 'b', 'a', 'a'];

review.slice().reverse().forEach(function(item, index, object) {
  if (item === 'a') {
    review.splice(object.length - 1 - index, 1);
  }
});

log(review);
<pre id="out"></pre>

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

var pre = document.getElementById('out');

function log(result) {
  pre.appendChild(document.createTextNode(result + '\n'));
}

function* reverseKeys(arr) {
  var key = arr.length - 1;

  while (key >= 0) {
    yield key;
    key -= 1;
  }
}

var review = ['a', 'a', 'b', 'c', 'b', 'a', 'a'];

for (var index of reverseKeys(review)) {
  if (review[index] === 'a') {
    review.splice(index, 1);
  }
}

log(review);
<pre id="out"></pre>

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

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


উত্তর করার জন্য ধন্যবাদ. আমি আপনার সমাধানটি ব্যবহার করার চেষ্টা করেছি, তবে এটি এখনও অ্যারের থেকে উপাদানটি সরিয়ে ফেলছে না। আমি প্রশ্নের বিবরণ রাখব।
novicePrgrmr

এর console.log(review);পরে রাখুন forEach, যেমন আমার উদাহরণে।
Xotic750

4
সাবধান, এই দুটি বিরতি যদি টানা দুটি উপাদান মুছতে পারে: var পর্যালোচনা = ['a', 'a', 'c', 'b', 'a']; ['এ', 'সি', 'বি']
উপার্জন করবে

4
দ্রষ্টব্য - এই উত্তরটি ভুল! অগ্রণী সূচক দ্বারা অ্যারের মাধ্যমে পুনরাবৃত্তি। একবার আপনি নিম্নলিখিত আইটেমের সূচক পুনরাবৃত্তি করার সময় উপাদান মুছুন। এই উদাহরণস্বরূপ, একবার আপনি প্রথম 'এ' মুছে ফেললে, সূচী নম্বর 1 এখন 'সি' হয়ে যায়। সুতরাং প্রথম 'খ' এমনকি মূল্যায়ন করা হয় না। যেহেতু আপনি এটি মুছে ফেলার চেষ্টা করেন নি, এটি ঠিক হয়ে গেছে, তবে এটি উপায় নয়। অ্যারের বিপরীত অনুলিপিটি দিয়ে আপনার পুনরাবৃত্তি হওয়া উচিত এবং তারপরে মূল অ্যারেতে আইটেমগুলি মুছতে হবে।
danbars

4
@ এক্সোটিক 50৫০ - আসল উত্তরটি (এখন প্রথম কোড স্নিপেট হওয়ায়) ভুল কারণ কেবল ফরইচ অ্যারের সমস্ত উপাদানকে লুপ করবে না, যেমনটি আমি পূর্ববর্তী মন্তব্যে বলেছি। আমি জানি যে প্রশ্নটি কীভাবে প্রতিটি লুপে উপাদানগুলি সরিয়ে ফেলা যায়, তবে সহজ উত্তরটি হ'ল আপনি এটি করেন না। যেহেতু অনেকে এই উত্তরগুলি পড়ছেন, এবং অনেক সময় অন্ধভাবে উত্তরগুলি অনুলিপি করছেন (বিশেষত স্বীকৃত উত্তর), কোডের ত্রুটিগুলি লক্ষ্য করা গুরুত্বপূর্ণ। আমি মনে করি যে বিপরীতে লুপটি সহজতম, সবচেয়ে দক্ষ এবং সর্বাধিক পঠনযোগ্য সমাধান এবং গ্রহণযোগ্য উত্তর হওয়া উচিত
ড্যানবারস

37

এর Array.prototype.filterপরিবর্তে ব্যবহার করুন forEach:

var pre = document.getElementById('out');

function log(result) {
  pre.appendChild(document.createTextNode(result + '\n'));
}

var review = ['a', 'b', 'c', 'b', 'a', 'e'];
review = review.filter(item => item !== 'a');
log(review);

13

যদিও Xotic750 এর উত্তরটি বেশ কয়েকটি ভাল পয়েন্ট এবং সম্ভাব্য সমাধান সরবরাহ করে, তবে কখনও কখনও সহজ আরও ভাল

আপনি জানেন যে অ্যারেটি পুনরাবৃত্তি হচ্ছে তা পুনরাবৃত্তিতেই রূপান্তরিত হচ্ছে (অর্থাত্ কোনও আইটেম অপসারণ => সূচক পরিবর্তন), সুতরাং সহজ যুক্তিটি পুরানো ফ্যাশন for(à লা সি ভাষায়) পিছনে যেতে হবে :

let arr = ['a', 'a', 'b', 'c', 'b', 'a', 'a'];

for (let i = arr.length - 1; i >= 0; i--) {
  if (arr[i] === 'a') {
    arr.splice(i, 1);
  }
}

document.body.append(arr.join());

আপনি যদি সত্যিই এটির বিষয়ে চিন্তা করেন তবে এটি forEachএকটি forলুপের জন্য কেবল সিনট্যাকটিক চিনি ... সুতরাং যদি এটি আপনাকে সহায়তা না করে তবে দয়া করে এর বিরুদ্ধে আপনার মাথা ভাঙা বন্ধ করুন।


1

এটির পরিবর্তে আপনি সূচিপত্রও ব্যবহার করতে পারেন

var i = review.indexOf('\u2022 \u2022 \u2022');
if (i !== -1) review.splice(i,1);

1

আমি বুঝতে পেরেছি যে আপনি একটি শর্ত ব্যবহার করে অ্যারে থেকে সরাতে চান এবং অ্যারে থেকে সরানো আইটেম রয়েছে এমন আরও একটি অ্যারে রাখতে চান। সঠিক?

এ কেমন?

var review = ['a', 'b', 'c', 'ab', 'bc'];
var filtered = [];
for(var i=0; i < review.length;) {
  if(review[i].charAt(0) == 'a') {
    filtered.push(review.splice(i,1)[0]);
  }else{
    i++;
  }
}

console.log("review", review);
console.log("filtered", filtered);

আশা করি এই সাহায্য ...

যাইহোক, আমি 'ফর-লুপ'কে' ফর ইচ 'এর সাথে তুলনা করেছি।

যদি কোনও স্ট্রিংয়ে 'f' থাকে তবে মুছে ফেলা হলে ফলাফল আলাদা।

var review = ["of", "concat", "copyWithin", "entries", "every", "fill", "filter", "find", "findIndex", "flatMap", "flatten", "forEach", "includes", "indexOf", "join", "keys", "lastIndexOf", "map", "pop", "push", "reduce", "reduceRight", "reverse", "shift", "slice", "some", "sort", "splice", "toLocaleString", "toSource", "toString", "unshift", "values"];
var filtered = [];
for(var i=0; i < review.length;) {
  if( review[i].includes('f')) {
    filtered.push(review.splice(i,1)[0]);
  }else {
    i++;
  }
}
console.log("review", review);
console.log("filtered", filtered);
/**
 * review [  "concat",  "copyWithin",  "entries",  "every",  "includes",  "join",  "keys",  "map",  "pop",  "push",  "reduce",  "reduceRight",  "reverse",  "slice",  "some",  "sort",  "splice",  "toLocaleString",  "toSource",  "toString",  "values"] 
 */

console.log("========================================================");
review = ["of", "concat", "copyWithin", "entries", "every", "fill", "filter", "find", "findIndex", "flatMap", "flatten", "forEach", "includes", "indexOf", "join", "keys", "lastIndexOf", "map", "pop", "push", "reduce", "reduceRight", "reverse", "shift", "slice", "some", "sort", "splice", "toLocaleString", "toSource", "toString", "unshift", "values"];
filtered = [];

review.forEach(function(item,i, object) {
  if( item.includes('f')) {
    filtered.push(object.splice(i,1)[0]);
  }
});

console.log("-----------------------------------------");
console.log("review", review);
console.log("filtered", filtered);

/**
 * review [  "concat",  "copyWithin",  "entries",  "every",  "filter",  "findIndex",  "flatten",  "includes",  "join",  "keys",  "map",  "pop",  "push",  "reduce",  "reduceRight",  "reverse",  "slice",  "some",  "sort",  "splice",  "toLocaleString",  "toSource",  "toString",  "values"]
 */

এবং প্রতিটি পুনরাবৃত্তি দ্বারা সরান, ফলাফলও পৃথক।

var review = ["of", "concat", "copyWithin", "entries", "every", "fill", "filter", "find", "findIndex", "flatMap", "flatten", "forEach", "includes", "indexOf", "join", "keys", "lastIndexOf", "map", "pop", "push", "reduce", "reduceRight", "reverse", "shift", "slice", "some", "sort", "splice", "toLocaleString", "toSource", "toString", "unshift", "values"];
var filtered = [];
for(var i=0; i < review.length;) {
  filtered.push(review.splice(i,1)[0]);
}
console.log("review", review);
console.log("filtered", filtered);
console.log("========================================================");
review = ["of", "concat", "copyWithin", "entries", "every", "fill", "filter", "find", "findIndex", "flatMap", "flatten", "forEach", "includes", "indexOf", "join", "keys", "lastIndexOf", "map", "pop", "push", "reduce", "reduceRight", "reverse", "shift", "slice", "some", "sort", "splice", "toLocaleString", "toSource", "toString", "unshift", "values"];
filtered = [];

review.forEach(function(item,i, object) {
  filtered.push(object.splice(i,1)[0]);
});

console.log("-----------------------------------------");
console.log("review", review);
console.log("filtered", filtered);


0

নিম্নলিখিতটি আপনাকে সমস্ত উপাদান দেবে যা আপনার বিশেষ অক্ষরের সমান নয়!

review = jQuery.grep( review, function ( value ) {
    return ( value !== '\u2022 \u2022 \u2022' );
} );

0

আপনার এটি কীভাবে করা উচিত তা এখানে:

review.forEach(function(p,index,object){
   if(review[index] === '\u2022 \u2022 \u2022'){
      console.log('YippeeeE!!!!!!!!!!!!!!!!')
      review.splice(index, 1);
   }
});

4
আমি মনে করি না কেস। আমি পি কোড সূচক বলে ধরে আমার কোড পরিবর্তন করেছি এবং এখন এটি ifবিবৃতিতেও আসেনি।
novicePrgrmr

4
@ হোয়া কেয়ারস আপনার স্পেসটি দেখতে পাবেন ecma-international.org/ecma-262/5.1/#sec-15.4.4.18 কলব্যাক ফাংশন যুক্তিগুলি হলitem, index, object
Xotic750
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.