অন্য অ্যারেতে থাকা সমস্ত উপাদানগুলি সরান


222

আমি জাভাস্ক্রিপ্ট অ্যারে থেকে সমস্ত উপাদানগুলি অন্য কোনও অ্যারে উপস্থিত থাকলে অপসারণের একটি কার্যকর উপায় সন্ধান করছি।

// If I have this array:
var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];

// and this one:
var toRemove = ['b', 'c', 'g'];

আমি এটিকে এই অবস্থায় ছেড়ে দেওয়ার জন্য আমারআরয়েতে পরিচালনা করতে চাই: ['a', 'd', 'e', 'f']

JQuery এর সাথে, আমি ব্যবহার করছি grep()এবং inArray(), যা ভালভাবে কাজ করে:

myArray = $.grep(myArray, function(value) {
    return $.inArray(value, toRemove) < 0;
});

লুপিং এবং স্প্লিকিং ছাড়াই এটি করার কোনও খাঁটি জাভাস্ক্রিপ্ট উপায় আছে?




1
জাভাস্ক্রিপ্ট বা জ্যাকুরিতে আপনি কি অন্য একটি অ্যারে সরিয়ে ফেলতে পারবেন - এর সদৃশ নকল আপনি প্রশ্নটি লেখার সময় দেওয়া পরামর্শগুলিতে খুব বেশি মনোযোগ দিতে পারবেন না
এমপি্লুঞ্জন

যাই হোক না কেন, এটি সর্বদা কোনও স্তরে লুপিং জড়িত থাকবে।
নীল আকাশ

আপনি যদি সত্যই এটি "দক্ষ" হতে চান তবে আপনি যেমন কার্যকরী ধরণের পদ্ধতি ব্যবহার করবেন না .filter()। পরিবর্তে আপনি forলুপ ব্যবহার করবেন । .splice()মূল অর্ডার বজায় রাখার দরকার না হলে আপনি এড়াতে পারেন। অথবা .splice()আরও কার্যকর করার উপায় আছে যদি আপনি ভাবেন যে অনেকগুলি আইটেম অপসারণ করা হবে।
নীল আকাশ

উত্তর:


379

Array.filter()পদ্ধতিটি ব্যবহার করুন :

myArray = myArray.filter( function( el ) {
  return toRemove.indexOf( el ) < 0;
} );

ব্রাউজার সমর্থন হিসাবে ছোট উন্নতি হিসাবে Array.includes()বৃদ্ধি পেয়েছে:

myArray = myArray.filter( function( el ) {
  return !toRemove.includes( el );
} );

তীর ফাংশন ব্যবহার করে পরবর্তী অভিযোজন :

myArray = myArray.filter( ( el ) => !toRemove.includes( el ) );

23
ওপি: আপনি ব্যবহার করেন, তাহলে Underscore.js আছে .difference()মূলত এই আছে পারে।
বিল ক্রিসওয়েল

শুধু আমি যা খুঁজছিলাম। ধন্যবাদ. @ বিলক্রিসওয়েল, আমি আন্ডারস্কোর পরীক্ষা করব।
ট্যাপ করুন

1
@ অ্যালক্রাস্ট সব উপাদানকে toRemove()আপার ক্ষেত্রে রূপান্তর করুন এবং কলব্যাক থেকে বদলে elনিন el.toUpperCase()
সিরকো

5
বা সংক্ষিপ্ত:myArray = myArray.filter( el => !toRemove.includes( el ) );
538 রোমো

1
এই আদেশ n ^ 2 নয়?
ফ্রেজার কির্কম্যান

34

filterপদ্ধতি কৌতুক করতে হবে:

const myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
const toRemove = ['b', 'c', 'g'];

// ES5 syntax
const filteredArray = myArray.filter(function(x) { 
  return toRemove.indexOf(x) < 0;
});

যদি আপনার toRemoveঅ্যারে বড় হয় তবে এই ধরণের অনুসন্ধানের প্যাটার্নটি অদক্ষ হতে পারে। এটি কোনও মানচিত্র তৈরি করা আরও পারফরম্যান্স হতে পারে যাতে দেখার O(1)চেয়ে বরং চেহারাগুলি হয় O(n)

const toRemoveMap = toRemove.reduce(
  function(memo, item) {
    memo[item] = memo[item] || true;
    return memo;
  },
  {} // initialize an empty object
);

const filteredArray = myArray.filter(function (x) {
  return toRemoveMap[x];
});

// or, if you want to use ES6-style arrow syntax:
const toRemoveMap = toRemove.reduce((memo, item) => ({
  ...memo,
  [item]: true
}), {});

const filteredArray = myArray.filter(x => toRemoveMap[x]);

24

আপনি যদি কোন বস্তুর অ্যারে ব্যবহার করে থাকেন। তারপরে নীচের কোডটিতে যাদু করা উচিত, যেখানে কোনও বস্তুর সম্পত্তি সদৃশ আইটেমগুলি সরিয়ে নেওয়ার মানদণ্ড হবে।

নীচের উদাহরণে, প্রতিটি আইটেমের নামের তুলনা করে সদৃশগুলি সরানো হয়েছে।

এই উদাহরণ চেষ্টা করুন। http://jsfiddle.net/deepak7641/zLj133rh/

var myArray = [
  {name: 'deepak', place: 'bangalore'}, 
  {name: 'chirag', place: 'bangalore'}, 
  {name: 'alok', place: 'berhampur'}, 
  {name: 'chandan', place: 'mumbai'}
];
var toRemove = [
  {name: 'deepak', place: 'bangalore'},
  {name: 'alok', place: 'berhampur'}
];

for( var i=myArray.length - 1; i>=0; i--){
 	for( var j=0; j<toRemove.length; j++){
 	    if(myArray[i] && (myArray[i].name === toRemove[j].name)){
    		myArray.splice(i, 1);
    	}
    }
}

alert(JSON.stringify(myArray));



11

ECMAScript 6 সেট দুটি অ্যারের বিভিন্ন উপাদান গণনা করার জন্য ব্যবহার করা যেতে পারে:

const myArray = new Set(['a', 'b', 'c', 'd', 'e', 'f', 'g']);
const toRemove = new Set(['b', 'c', 'g']);

const difference = new Set([...myArray].filter((x) => !toRemove.has(x)));

console.log(Array.from(difference)); // ["a", "d", "e", "f"]


8

আমি সবেমাত্র প্রয়োগ করেছি:

Array.prototype.exclude = function(list){
        return this.filter(function(el){return list.indexOf(el)<0;})
}

হিসাবে ব্যবহত:

myArray.exclude(toRemove);

1
prototypesনেটিভ অবজেক্টস যেমন বাড়ানো ভাল অনুশীলন নয় Array। যে ভাষা ভবিষ্যত উন্নতির সঙ্গে একটি দীর্ঘ মেয়াদী দ্বন্দ্ব আছে পারে ( দেখুন flattenক্ষেত্রে )
MarcoL

6

আপনি যদি নতুন ইএস 5 স্টাফ ব্যবহার করতে না পারেন তবে filterআমার মনে হয় আপনি দুটি লুপের সাথে আটকে আছেন:

for( var i =myArray.length - 1; i>=0; i--){
  for( var j=0; j<toRemove.length; j++){
    if(myArray[i] === toRemove[j]){
      myArray.splice(i, 1);
    }
  }
}

ফিল্টারটি "নতুন HTML5 স্টাফ" নয়
goofballLogic

আমার "ES5 স্টাফ" লেখা উচিত ছিল। এটি ES3
মার্কোএল

6
var myArray = [
  {name: 'deepak', place: 'bangalore'}, 
  {name: 'chirag', place: 'bangalore'}, 
  {name: 'alok', place: 'berhampur'}, 
  {name: 'chandan', place: 'mumbai'}
];
var toRemove = [
  {name: 'deepak', place: 'bangalore'},
  {name: 'alok', place: 'berhampur'}
];



myArray = myArray.filter(ar => !toRemove.find(rm => (rm.name === ar.name && ar.place === rm.place) ))

আপনি কি এই জাতীয় কোনও ভাল প্রশ্ন সম্পর্কে কিছু ব্যাখ্যা যুক্ত করতে আপত্তি করবেন?
harmonica141

1
সমস্যার সমাধানের জন্য আমি কয়েক ঘন্টা অনুসন্ধান করেছি এবং সবেমাত্র পেয়েছি, দুর্দান্ত। আপনাকে অনেক ধন্যবাদ!
তারভো মেসেপ্পে


3

আপনি লোডাশ থেকে _ ডিফারেন্সবাই ব্যবহার করতে পারেন

const myArray = [
  {name: 'deepak', place: 'bangalore'}, 
  {name: 'chirag', place: 'bangalore'}, 
  {name: 'alok', place: 'berhampur'}, 
  {name: 'chandan', place: 'mumbai'}
];
const toRemove = [
  {name: 'deepak', place: 'bangalore'},
  {name: 'alok', place: 'berhampur'}
];
const sorted = _.differenceBy(myArray, toRemove, 'name');

উদাহরণ কোড এখানে: কোডপেন


বৈশিষ্ট্যটি যদি বস্তুর ভিতরে বাসা বাঁধে তবে কী হবে? আপনার ক্ষেত্রে যেমন কিছু পরীক্ষা {নাম: 'গভীর', স্থান: 'বেঙ্গালুরু', নেস্টেড: {পরীক্ষা: 1}}
চরিত জয়সঙ্কা

2

কীভাবে সম্ভব সবচেয়ে সহজ:

var myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
var toRemove = ['b', 'c', 'g'];

var myArray = myArray.filter((item) => !toRemove.includes(item));
console.log(myArray)


2
মনে রাখবেন যে includesES7 এর আগে উপলভ্য নয়।
গ্রেগ

0

অন্য অ্যারে থাকা সমস্ত উপাদান মুছে ফেলার সঠিক উপায় হ'ল কেবল উপাদানগুলি সরিয়ে সূত্রের অ্যারে একই বস্তু তৈরি করা:

Array.prototype.removeContained = function(array) {
  var i, results;
  i = this.length;
  results = [];
  while (i--) {
    if (array.indexOf(this[i]) !== -1) {
      results.push(this.splice(i, 1));
    }
  }
  return results;
};

বা কফিস্ক্রিপ্ট সমতুল্য:

Array.prototype.removeContained = (array) ->
  i = @length
  @splice i, 1 while i-- when array.indexOf(@[i]) isnt -1

ক্রোম দেব সরঞ্জামগুলির মধ্যে পরীক্ষা করা:

19: 33: 04.447 a = 1
19: 33: 06.354 খ = 2
19: 33: 07.615 সি = 3
19: 33: 09.981 আরে = [এ, বি, সি]
19: 33: 16.460 এআর 1 = আরআর

19: 33: 20.317 arr1 === আর
19: 33: 20.331 সত্য

19: 33: 43.592 arr.remove কন্টিনড ([a, c])
19: 33: 52.433 আরার === arr1
19: 33: 52.438 সত্য

যখন আপনি প্রচুর পরিমাণে পর্যবেক্ষক এবং পুনরায় লোড ছাড়াই সংগ্রহগুলি আপডেট করেন তখন কৌনিক কাঠামো ব্যবহার করা উত্স অবজেক্টে পয়েন্টার রাখার সেরা উপায় way


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

0

আমি কোনও অন্তর্নির্মিত পদ্ধতি ব্যবহার না করে যুক্তিটি তৈরি করি, দয়া করে আমাকে কোনও অপ্টিমাইজেশন বা পরিবর্তনগুলি জানান know আমি জেএস এডিটরটিতে পরীক্ষা করেছি এটি ঠিকঠাক কাজ করছে।

var myArray = [
            {name: 'deepak', place: 'bangalore'},
            {name: 'alok', place: 'berhampur'},
            {name: 'chirag', place: 'bangalore'},
            {name: 'chandan', place: 'mumbai'},

        ];
        var toRemove = [

            {name: 'chirag', place: 'bangalore'},
            {name: 'deepak', place: 'bangalore'},
            /*{name: 'chandan', place: 'mumbai'},*/
            /*{name: 'alok', place: 'berhampur'},*/


        ];
        var tempArr = [];
        for( var i=0 ; i < myArray.length; i++){
            for( var j=0; j<toRemove.length; j++){
                var toRemoveObj = toRemove[j];
                if(myArray[i] && (myArray[i].name === toRemove[j].name)) {
                    break;
                }else if(myArray[i] && (myArray[i].name !== toRemove[j].name)){
                        var fnd = isExists(tempArr,myArray[i]);
                        if(!fnd){
                            var idx = getIdex(toRemove,myArray[i])
                            if (idx === -1){
                                tempArr.push(myArray[i]);
                            }

                        }

                    }

                }
        }
        function isExists(source,item){
            var isFound = false;
            for( var i=0 ; i < source.length; i++){
                var obj = source[i];
                if(item && obj && obj.name === item.name){
                    isFound = true;
                    break;
                }
            }
            return isFound;
        }
        function getIdex(toRemove,item){
            var idex = -1;
            for( var i=0 ; i < toRemove.length; i++){
                var rObj =toRemove[i];
                if(rObj && item && rObj.name === item.name){
                    idex=i;
                    break;
                }
            }
            return idex;
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.