অন্য অ্যারের সমস্ত উপাদান থেকে অ্যারে কীভাবে ফিল্টার করা যায়


139


আমি অন্যরকমের সমস্ত উপাদান থেকে অ্যারে ফিল্টার করার সেরা উপায়টি বুঝতে চাই । আমি ফিল্টার ফাংশন দিয়ে চেষ্টা করেছি, তবে কীভাবে আমি যে মানগুলি সরিয়ে দিতে চাই তা কীভাবে এটি দেওয়া যায় তা আমার কাছে আসে না।
কিছুটা এইরকম:

var array = [1,2,3,4];
var anotherOne = [2,4];
var filteredArray = array.filter(myCallback);
// filteredArray should now be [1,3]


function myCallBack(){
    return element ! filteredArray; 
    //which clearly can't work since we don't have the reference <,< 
}

যদি ফিল্টার ফাংশন কার্যকর না হয় তবে আপনি কীভাবে এটি বাস্তবায়ন করবেন?
সম্পাদনা: আমি সম্ভাব্য সদৃশ প্রশ্নটি পরীক্ষা করেছি এবং যারা জাভাস্ক্রিপ্ট সহজেই বুঝতে পারে তাদের পক্ষে এটি কার্যকর হতে পারে। উত্তম হিসাবে পরীক্ষিত উত্তরগুলি বিষয়গুলিকে সহজ করে তোলে।


8
কলব্যাক ফিল্টার করতে return arrTwo.indexOf(e) === -1; কোডটি ব্যবহার করতে অন্য অ্যারে পাস করুন :var filteredArr = firstArr.filter(el => secondArr.indexOf(el) === -1);
তুষার


উভয় অ্যারে আদেশ করা হয়?
নিনা শোলজ

অ্যারেও অর্ডার করা হয় না, দ্বিতীয় অ্যারেতে এলোমেলো সংখ্যক উপাদান রয়েছে।
Koop4

উত্তর:


145

আপনার ফিল্টার অ্যারেটিকে বৈশ্বিক ভেরিয়েবলে সঞ্চয় করতে এড়াতে আপনি ফাংশনের thisপ্যারামিটার ব্যবহার করতে পারেন filter()

var filtered = [1, 2, 3, 4].filter(
    function(e) {
      return this.indexOf(e) < 0;
    },
    [2, 4]
);
console.log(filtered);


ইহা যাদুর মত কাজ করে। ফাংশনটি বাইরে নিয়ে যাওয়া এবং আরও বোঝার উপায়ে কল করা কি সম্ভব? পছন্দ: var ফিল্টার = [1,2,3,4]। ফিল্টার (মাইফান্ট (), [2,4]);
কোপ 4

1
অবশ্যই: var myFunct = ফাংশন (ঙ) {this.indexOf (e) <0; {; var ফিল্টার = [1,2,3,4]। ফিল্টার (মাইফান্ট, [2,4]);
সাইমন হাই

1
ES2016 বা টাইপসক্রিপ্টে ল্যাম্বডা এক্সপ্রেশন দিয়ে এটি অর্জন করা যেতে পারে?
প্রাবু


আমি যখন এই পদ্ধতির ব্যবহার করি, তখন ফিল্টারটির দ্বিতীয় প্যারাম এটিকে আমার ফাংশন হিসাবে তৈরি করে না thisthisসবসময়ই অপরিজ্ঞাত বলে মনে হচ্ছে ?! অদ্ভুত
কিছু 12

149

আমি নিম্নলিখিত হিসাবে করব;

var arr = [1,2,3,4],
    brr = [2,4],
    res = arr.filter(f => !brr.includes(f));
console.log(res);


6
সঙ্গীত তারকা. আপনাকে ধন্যবাদ, এটি কিছুটা ভিন্ন সমস্যা সমাধানের জন্য অবিশ্বাস্যরূপে সহায়ক। const filteredResults = this.state.cards.filter( result => !this.state.filterOut.includes(result.category) ) বিক্রিয়া উপাদানটিতে মানগুলির অ্যারের উপর ভিত্তি করে অবজেক্টগুলির একটি অ্যারে ফিল্টারিং: যেখানে এই.সেটেট কার্ডগুলি অবজেক্টগুলির একটি অ্যারে এবং this.state.filterOut মানগুলির একটি অ্যারে যা অবজেক্টগুলিতে 'বিভাগ' কীটির সাথে মিলিত হয় আমি অপসারণ করতে চেয়েছিলাম।
জোশ পিটম্যান

আমি জানি, এটি একটি পুরানো প্রতিক্রিয়া, তবে আমি কেবল আপনাকে জানাতে চেয়েছিলাম যে আমি এই প্রতিক্রিয়াটিকে আরও অনেক বেশি পছন্দ করেছি এবং এটি আমার একটি সমস্যা থেকে আমার সহায়তা করেছে। এটি খুব পঠনযোগ্য এবং এইভাবে বিষয়টি আরও ভালভাবে বুঝতে আমার পক্ষে সহজ হয়েছিল।
ak.leimrey

1
অন্তর্ভুক্ত কেবল ES7 থেকে কাজ করবে। আপনি যদি ES6 ব্যবহার করেন তবে গৃহীত সমাধানটি ব্যবহার করুন।
rudrasiva86

39
var array = [1,2,3,4];
var anotherOne = [2,4];
var filteredArray = array.filter(myCallBack);

function myCallBack(el){
  return anotherOne.indexOf(el) < 0;
}

কলব্যাকে, আপনি প্রতিটি মানের কিনা তা পরীক্ষা করে দেখুন array করে দেখুনanotherOne

https://jsfiddle.net/0tsyc1sx/

আপনি যদি ব্যবহার করে থাকেন তবে lodash.jsব্যবহার করুন_.difference

filteredArray = _.difference(array, anotherOne);

ডেমো

আপনার যদি অবজেক্টগুলির একটি অ্যারে থাকে:

var array = [{id :1, name :"test1"},{id :2, name :"test2"},{id :3, name :"test3"},{id :4, name :"test4"}];

var anotherOne = [{id :2, name :"test2"}, {id :4, name :"test4"}];

var filteredArray  = array.filter(function(array_el){
   return anotherOne.filter(function(anotherOne_el){
      return anotherOne_el.id == array_el.id;
   }).length == 0
});

অবজেক্টগুলির ডেমো অ্যারে

লোডাস সহ বস্তুর ডেমো ভিন্ন অ্যারে


হাই আপনি কি বস্তুর অ্যারে এটিকে প্রসারিত করতে পারেন? আমি এটির অত্যধিক প্রশংসা করব
রোল

আপনি কি লোটাস ব্যবহার করছেন?
অ্যাশব্রিংগার

কোন স্যার আমি কলব্যাক পদ্ধতি অনুসরণ করা পছন্দ করেন না
রোল

ভাল স্যার এটি সত্যিই কাজ করেছে তবে আইডি বাদে আমি কীভাবে নাম দিয়ে অন্য ফিল্টার করব?
রোল

Hummm ... আপনি শুধু পরিবর্তন করতে হবে idযে anotherOne_el.id == array_el.idযাই হোক না কেন মূল আপনার নিজের বস্তু আপনি আছেন সঙ্গে। জাভাস্ক্রিপ্টে অ্যারে এবং অবজেক্ট সম্পর্কে আপনার জ্ঞান পাওয়া উচিত, এটি আপনাকে উত্তরটি আরও ভালভাবে বুঝতে সাহায্য করবে
অ্যাশব্রিংগার

26

        /* Here's an example that uses (some) ES6 Javascript semantics to filter an object array by another object array. */

        // x = full dataset
        // y = filter dataset
        let x = [
            {"val": 1, "text": "a"},
            {"val": 2, "text": "b"},
            {"val": 3, "text": "c"},
            {"val": 4, "text": "d"},
            {"val": 5, "text": "e"}
            ],
            y = [
            {"val": 1, "text": "a"},
            {"val": 4, "text": "d"}               
            ];

        // Use map to get a simple array of "val" values. Ex: [1,4]
        let yFilter = y.map(itemY => { return itemY.val; });

        // Use filter and "not" includes to filter the full dataset by the filter dataset's val.
        let filteredX = x.filter(itemX => !yFilter.includes(itemX.val));

        // Print the result.
        console.log(filteredX);


ঠিক আমার যা প্রয়োজন ছিল। ধন্যবাদ
বিক্রেত্নেগি

12

নীচের কোডটি অন্য অ্যারের সাথে সম্মানের সাথে অ্যারে ফিল্টার করার সহজ উপায়। উভয় অ্যারে মানগুলির পরিবর্তে তাদের ভিতরে বস্তু থাকতে পারে।

let array1 = [1, 3, 47, 1, 6, 7];
let array2 = [3, 6];
let filteredArray1 = array1.filter(el => array2.includes(el));
console.log(filteredArray1); 

আউটপুট: [3, 6]


8

আপনার প্রশ্নের জন্য অনেক উত্তর আছে, তবে আমি কাউকে ল্যাম্বডা এক্সপ্রেসন ব্যবহার করতে দেখছি না:

var array = [1,2,3,4];
var anotherOne = [2,4];
var filteredArray = array.filter(x => anotherOne.indexOf(x) < 0);

6

উপরের সমস্ত সমাধান "কাজ" করে তবে কার্য সম্পাদনের জন্য অনুকূলের চেয়ে কম এবং এগুলি একই পদ্ধতিতে সমস্যার দিকে এগিয়ে যায় যা অ্যারে.প্রোটোটাইপ.আইনডেক্সফ বা অ্যারে.প্রোটোটাইপ.এনক্লুডস ব্যবহার করে প্রতিটি বিন্দুতে রৈখিকভাবে সমস্ত এন্ট্রি অনুসন্ধান করে । একটি আরও দ্রুত সমাধান (বেশিরভাগ ক্ষেত্রে বাইনারি অনুসন্ধানের চেয়েও দ্রুত) সারণি সাজানো এবং নীচের মত যাবতীয়ভাবে এগিয়ে যেতে হবে। যাইহোক, একটি খারাপ দিক এটির জন্য অ্যারেতে থাকা সমস্ত এন্ট্রিগুলির সংখ্যা বা স্ট্রিং হওয়া দরকার। এছাড়াও, বাইনারি অনুসন্ধান কিছু বিরল ক্ষেত্রে প্রগতিশীল রৈখিক অনুসন্ধানের চেয়ে দ্রুত হতে পারে। এই প্রবণতাগুলি থেকে উঠে আসে যে আমার প্রগতিশীল রৈখিক অনুসন্ধানে ও এর জটিলতা রয়েছে (2 এন 1 + এন 2 ) (কেবল ও (এন 1 + এন2 ) দ্রুত সি / সি ++ সংস্করণে) (যেখানে এন 1 সন্ধান করা অ্যারে এবং এন 2 ফিল্টার অ্যারে রয়েছে), বাইনারি অনুসন্ধানে ও এর জটিলতা রয়েছে (এন 1 সিল (লগ 2 এন) 2 )) এর(সিল = চারপাশে - সিলিং পর্যন্ত), এবং সর্বশেষে, সূচক O এর ও (এন 1 সিল (এন 2 ÷ 2 ) থেকে গড় গড়েও (এন 1 ) এবং ও (এন 1 এন 2 ) এর মধ্যে অত্যন্ত পরিবর্তনশীল জটিলতা রয়েছে search )) । সুতরাং, সূচকগুলির ক্ষেত্রে কেবলমাত্র গড়, দ্রুততম হবে(ঢ 1 , এন 2 ) equaling {1,2} , {1,3} , অথবা {এক্স, 1 | x∈N} । তবে এটি আধুনিক হার্ডওয়্যারটির নিখুঁত প্রতিনিধিত্ব নয়। IndexOf স্থানীয়ভাবে এটি অত্যাধুনিক ব্রাউজারে পুরাদস্তুরভাবে চিন্তনীয় অপ্টিমাইজ করা হয়, এটা খুব আইন সাপেক্ষে উপার্জন শাখা ভবিষ্যদ্বাণী । সুতরাং, যদি আমরা প্রগতিশীল রৈখিক এবং বাইনারি অনুসন্ধানের সাথে যেমন সূচিপত্রগুলিতে একই ধারণা করি - তবে অ্যারেটি নির্ধারিত হয় - তারপরে, লিঙ্কটিতে তালিকাভুক্ত পরিসংখ্যান অনুসারে আমরা ইনডেক্সফের জন্য মোটামুটি 6x গতি আশা করতে পারি, ও (এন 1 ÷ 6) এবং ও (এন 1 এন 2 ) এর মধ্যে জটিলতার স্থান পরিবর্তন করছে, ও থেকে গড় গড়ে 7 ÷ 12%)ও (এন 1 সিল (এন 2।। পরিশেষে, নোটটি নিন যে নীচের সমাধানটি কখনও কখনও বস্তুর সাথে কাজ করবে না কারণ জাভাস্ক্রিপ্টের বস্তুগুলিকে জাভাস্ক্রিপ্টের পয়েন্টারগুলির সাথে তুলনা করা যায় না।

function sortAnyArray(a,b) { return a>b ? 1 : (a===b ? 0 : -1); }
function sortIntArray(a,b) { return (a|0) - (b|0) |0; }
function fastFilter(array, handle) {
    var out=[], value=0;
    for (var i=0,  len=array.length|0; i < len; i=i+1|0)
        if (handle(value = array[i])) 
            out.push( value );
    return out;
}

const Math_clz32 = Math.clz32 || (function(log, LN2){
  return function(x) {
    return 31 - log(x >>> 0) / LN2 | 0; // the "| 0" acts like math.floor
  };
})(Math.log, Math.LN2);

/* USAGE:
  filterArrayByAnotherArray(
      [1,3,5],
      [2,3,4]
  ) yields [1, 5], and it can work with strings too
*/
function filterArrayByAnotherArray(searchArray, filterArray) {
    if (
        // NOTE: This does not check the whole array. But, if you know
        //        that there are only strings or numbers (not a mix of
        //        both) in the array, then this is a safe assumption.
        // Always use `==` with `typeof` because browsers can optimize
        //  the `==` into `===` (ONLY IN THIS CIRCUMSTANCE)
        typeof searchArray[0] == "number" &&
        typeof filterArray[0] == "number" &&
        (searchArray[0]|0) === searchArray[0] &&
        (filterArray[0]|0) === filterArray[0]
    ) {filterArray
        // if all entries in both arrays are integers
        searchArray.sort(sortIntArray);
        filterArray.sort(sortIntArray);
    } else {
        searchArray.sort(sortAnyArray);
        filterArray.sort(sortAnyArray);
    }
    var searchArrayLen = searchArray.length, filterArrayLen = filterArray.length;
    var progressiveLinearComplexity = ((searchArrayLen<<1) + filterArrayLen)>>>0
    var binarySearchComplexity= (searchArrayLen * (32-Math_clz32(filterArrayLen-1)))>>>0;
    // After computing the complexity, we can predict which algorithm will be the fastest
    var i = 0;
    if (progressiveLinearComplexity < binarySearchComplexity) {
        // Progressive Linear Search
        return fastFilter(searchArray, function(currentValue){
            while (filterArray[i] < currentValue) i=i+1|0;
            // +undefined = NaN, which is always false for <, avoiding an infinite loop
            return filterArray[i] !== currentValue;
        });
    } else {
        // Binary Search
        return fastFilter(
            searchArray,
            fastestBinarySearch(filterArray)
        );
    }
}

// see https://stackoverflow.com/a/44981570/5601591 for implementation
//  details about this binary search algorithm

function fastestBinarySearch(array){
  var initLen = (array.length|0) - 1 |0;
  
  const compGoto = Math_clz32(initLen) & 31;
  return function(sValue) {
    var len = initLen |0;
    switch (compGoto) {
      case 0:
        if (len & 0x80000000) {
          const nCB = len & 0x80000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 1:
        if (len & 0x40000000) {
          const nCB = len & 0xc0000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 2:
        if (len & 0x20000000) {
          const nCB = len & 0xe0000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 3:
        if (len & 0x10000000) {
          const nCB = len & 0xf0000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 4:
        if (len & 0x8000000) {
          const nCB = len & 0xf8000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 5:
        if (len & 0x4000000) {
          const nCB = len & 0xfc000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 6:
        if (len & 0x2000000) {
          const nCB = len & 0xfe000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 7:
        if (len & 0x1000000) {
          const nCB = len & 0xff000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 8:
        if (len & 0x800000) {
          const nCB = len & 0xff800000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 9:
        if (len & 0x400000) {
          const nCB = len & 0xffc00000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 10:
        if (len & 0x200000) {
          const nCB = len & 0xffe00000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 11:
        if (len & 0x100000) {
          const nCB = len & 0xfff00000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 12:
        if (len & 0x80000) {
          const nCB = len & 0xfff80000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 13:
        if (len & 0x40000) {
          const nCB = len & 0xfffc0000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 14:
        if (len & 0x20000) {
          const nCB = len & 0xfffe0000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 15:
        if (len & 0x10000) {
          const nCB = len & 0xffff0000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 16:
        if (len & 0x8000) {
          const nCB = len & 0xffff8000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 17:
        if (len & 0x4000) {
          const nCB = len & 0xffffc000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 18:
        if (len & 0x2000) {
          const nCB = len & 0xffffe000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 19:
        if (len & 0x1000) {
          const nCB = len & 0xfffff000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 20:
        if (len & 0x800) {
          const nCB = len & 0xfffff800;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 21:
        if (len & 0x400) {
          const nCB = len & 0xfffffc00;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 22:
        if (len & 0x200) {
          const nCB = len & 0xfffffe00;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 23:
        if (len & 0x100) {
          const nCB = len & 0xffffff00;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 24:
        if (len & 0x80) {
          const nCB = len & 0xffffff80;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 25:
        if (len & 0x40) {
          const nCB = len & 0xffffffc0;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 26:
        if (len & 0x20) {
          const nCB = len & 0xffffffe0;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 27:
        if (len & 0x10) {
          const nCB = len & 0xfffffff0;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 28:
        if (len & 0x8) {
          const nCB = len & 0xfffffff8;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 29:
        if (len & 0x4) {
          const nCB = len & 0xfffffffc;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 30:
        if (len & 0x2) {
          const nCB = len & 0xfffffffe;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 31:
        if (len & 0x1) {
          const nCB = len & 0xffffffff;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
    }
    // MODIFICATION: Instead of returning the index, this binary search
    //                instead returns whether something was found or not.
    if (array[len|0] !== sValue) {
       return true; // preserve the value at this index
    } else {
       return false; // eliminate the value at this index
    }
  };
}

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

আপনি যদি ফাইল আকার (যা আমি সম্মান করি) সম্পর্কে কুঁকড়ে থাকেন তবে ফাইলের আকার হ্রাস করতে এবং রক্ষণাবেক্ষণযোগ্যতা বাড়াতে আপনি কিছুটা পারফরম্যান্স ত্যাগ করতে পারেন।

function sortAnyArray(a,b) { return a>b ? 1 : (a===b ? 0 : -1); }
function sortIntArray(a,b) { return (a|0) - (b|0) |0; }
function fastFilter(array, handle) {
    var out=[], value=0;
    for (var i=0,  len=array.length|0; i < len; i=i+1|0)
        if (handle(value = array[i])) 
            out.push( value );
    return out;
}

/* USAGE:
  filterArrayByAnotherArray(
      [1,3,5],
      [2,3,4]
  ) yields [1, 5], and it can work with strings too
*/
function filterArrayByAnotherArray(searchArray, filterArray) {
    if (
        // NOTE: This does not check the whole array. But, if you know
        //        that there are only strings or numbers (not a mix of
        //        both) in the array, then this is a safe assumption.
        typeof searchArray[0] == "number" &&
        typeof filterArray[0] == "number" &&
        (searchArray[0]|0) === searchArray[0] &&
        (filterArray[0]|0) === filterArray[0]
    ) {
        // if all entries in both arrays are integers
        searchArray.sort(sortIntArray);
        filterArray.sort(sortIntArray);
    } else {
        searchArray.sort(sortAnyArray);
        filterArray.sort(sortAnyArray);
    }
    // Progressive Linear Search
    var i = 0;
    return fastFilter(searchArray, function(currentValue){
        while (filterArray[i] < currentValue) i=i+1|0;
        // +undefined = NaN, which is always false for <, avoiding an infinite loop
        return filterArray[i] !== currentValue;
    });
}

গতির পার্থক্য প্রমাণ করতে, আসুন আমরা কিছু জেএসপিফারফ পরীক্ষা করি। ১ elements টি উপাদানের একটি অ্যারে ফিল্টার করার জন্য , বাইনারি অনুসন্ধানগুলি ইনডেক্সের চেয়ে প্রায় 17% দ্রুত হয় যখন ফিল্টারআরেবাইঅনোথের অ্যারে ইন্ডেক্সফের চেয়ে প্রায় 93% দ্রুত is 256 টি উপাদানের একটি অ্যারের ফিল্টার করার জন্য , বাইনারি অনুসন্ধান সূচিপত্রের তুলনায় প্রায় 291% দ্রুত এবং ফিল্টারআরেবাইঅনোথার অ্যারে সূচিপত্রের তুলনায় প্রায় 353% দ্রুত। 4096 উপাদানগুলির একটি অ্যারের ফিল্টার করার জন্য , বাইনারি অনুসন্ধানগুলি ইনডেক্সের তুলনায় প্রায় 2655% দ্রুত হয় যখন ফিল্টারআরেবাইঅনোথর অ্যারে সূচকের চেয়ে প্রায় 4627% দ্রুত is

বিপরীত-ফিল্টারিং (একটি AND গেটের মতো)

পূর্ববর্তী বিভাগে অ্যারে এবং অ্যারে বি নিতে কোড সরবরাহ করেছিল এবং বি থেকে বিদ্যমান সমস্ত উপাদানগুলিকে সরিয়ে ফেলবে:

filterArrayByAnotherArray(
    [1,3,5],
    [2,3,4]
);
// yields [1, 5]

এই পরবর্তী বিভাগটি বিপরীতে-ফিল্টারিংয়ের জন্য কোড সরবরাহ করবে, যেখানে আমরা বি থেকে বিদ্যমান না এমন A থেকে সমস্ত উপাদান সরিয়ে ফেলব This

reverseFilterArrayByAnotherArray(
    [1,3,5],
    [2,3,4]
);
// yields [3]

বিপরীত ফিল্টারিংয়ের জন্য কোডটি এখানে:

function sortAnyArray(a,b) { return a>b ? 1 : (a===b ? 0 : -1); }
function sortIntArray(a,b) { return (a|0) - (b|0) |0; }
function fastFilter(array, handle) {
    var out=[], value=0;
    for (var i=0,  len=array.length|0; i < len; i=i+1|0)
        if (handle(value = array[i])) 
            out.push( value );
    return out;
}

const Math_clz32 = Math.clz32 || (function(log, LN2){
  return function(x) {
    return 31 - log(x >>> 0) / LN2 | 0; // the "| 0" acts like math.floor
  };
})(Math.log, Math.LN2);

/* USAGE:
  reverseFilterArrayByAnotherArray(
      [1,3,5],
      [2,3,4]
  ) yields [3], and it can work with strings too
*/
function reverseFilterArrayByAnotherArray(searchArray, filterArray) {
    if (
        // NOTE: This does not check the whole array. But, if you know
        //        that there are only strings or numbers (not a mix of
        //        both) in the array, then this is a safe assumption.
        // Always use `==` with `typeof` because browsers can optimize
        //  the `==` into `===` (ONLY IN THIS CIRCUMSTANCE)
        typeof searchArray[0] == "number" &&
        typeof filterArray[0] == "number" &&
        (searchArray[0]|0) === searchArray[0] &&
        (filterArray[0]|0) === filterArray[0]
    ) {filterArray
        // if all entries in both arrays are integers
        searchArray.sort(sortIntArray);
        filterArray.sort(sortIntArray);
    } else {
        searchArray.sort(sortAnyArray);
        filterArray.sort(sortAnyArray);
    }
    var searchArrayLen = searchArray.length, filterArrayLen = filterArray.length;
    var progressiveLinearComplexity = ((searchArrayLen<<1) + filterArrayLen)>>>0
    var binarySearchComplexity= (searchArrayLen * (32-Math_clz32(filterArrayLen-1)))>>>0;
    // After computing the complexity, we can predict which algorithm will be the fastest
    var i = 0;
    if (progressiveLinearComplexity < binarySearchComplexity) {
        // Progressive Linear Search
        return fastFilter(searchArray, function(currentValue){
            while (filterArray[i] < currentValue) i=i+1|0;
            // +undefined = NaN, which is always false for <, avoiding an infinite loop
            // For reverse filterning, I changed !== to ===
            return filterArray[i] === currentValue;
        });
    } else {
        // Binary Search
        return fastFilter(
            searchArray,
            inverseFastestBinarySearch(filterArray)
        );
    }
}

// see https://stackoverflow.com/a/44981570/5601591 for implementation
//  details about this binary search algorithim

function inverseFastestBinarySearch(array){
  var initLen = (array.length|0) - 1 |0;
  
  const compGoto = Math_clz32(initLen) & 31;
  return function(sValue) {
    var len = initLen |0;
    switch (compGoto) {
      case 0:
        if (len & 0x80000000) {
          const nCB = len & 0x80000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 1:
        if (len & 0x40000000) {
          const nCB = len & 0xc0000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 2:
        if (len & 0x20000000) {
          const nCB = len & 0xe0000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 3:
        if (len & 0x10000000) {
          const nCB = len & 0xf0000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 4:
        if (len & 0x8000000) {
          const nCB = len & 0xf8000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 5:
        if (len & 0x4000000) {
          const nCB = len & 0xfc000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 6:
        if (len & 0x2000000) {
          const nCB = len & 0xfe000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 7:
        if (len & 0x1000000) {
          const nCB = len & 0xff000000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 8:
        if (len & 0x800000) {
          const nCB = len & 0xff800000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 9:
        if (len & 0x400000) {
          const nCB = len & 0xffc00000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 10:
        if (len & 0x200000) {
          const nCB = len & 0xffe00000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 11:
        if (len & 0x100000) {
          const nCB = len & 0xfff00000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 12:
        if (len & 0x80000) {
          const nCB = len & 0xfff80000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 13:
        if (len & 0x40000) {
          const nCB = len & 0xfffc0000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 14:
        if (len & 0x20000) {
          const nCB = len & 0xfffe0000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 15:
        if (len & 0x10000) {
          const nCB = len & 0xffff0000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 16:
        if (len & 0x8000) {
          const nCB = len & 0xffff8000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 17:
        if (len & 0x4000) {
          const nCB = len & 0xffffc000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 18:
        if (len & 0x2000) {
          const nCB = len & 0xffffe000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 19:
        if (len & 0x1000) {
          const nCB = len & 0xfffff000;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 20:
        if (len & 0x800) {
          const nCB = len & 0xfffff800;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 21:
        if (len & 0x400) {
          const nCB = len & 0xfffffc00;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 22:
        if (len & 0x200) {
          const nCB = len & 0xfffffe00;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 23:
        if (len & 0x100) {
          const nCB = len & 0xffffff00;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 24:
        if (len & 0x80) {
          const nCB = len & 0xffffff80;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 25:
        if (len & 0x40) {
          const nCB = len & 0xffffffc0;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 26:
        if (len & 0x20) {
          const nCB = len & 0xffffffe0;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 27:
        if (len & 0x10) {
          const nCB = len & 0xfffffff0;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 28:
        if (len & 0x8) {
          const nCB = len & 0xfffffff8;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 29:
        if (len & 0x4) {
          const nCB = len & 0xfffffffc;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 30:
        if (len & 0x2) {
          const nCB = len & 0xfffffffe;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
      case 31:
        if (len & 0x1) {
          const nCB = len & 0xffffffff;
          len ^= (len ^ (nCB-1)) & ((array[nCB] <= sValue |0) - 1 >>>0);
        }
    }
    // MODIFICATION: Instead of returning the index, this binary search
    //                instead returns whether something was found or not.
    // For reverse filterning, I swapped true with false and vice-versa
    if (array[len|0] !== sValue) {
       return false; // preserve the value at this index
    } else {
       return true; // eliminate the value at this index
    }
  };
}

বিপরীত ফিল্টারিং কোডের ধীরতর ছোট সংস্করণের জন্য, নীচে দেখুন।

function sortAnyArray(a,b) { return a>b ? 1 : (a===b ? 0 : -1); }
function sortIntArray(a,b) { return (a|0) - (b|0) |0; }
function fastFilter(array, handle) {
    var out=[], value=0;
    for (var i=0,  len=array.length|0; i < len; i=i+1|0)
        if (handle(value = array[i])) 
            out.push( value );
    return out;
}

/* USAGE:
  reverseFilterArrayByAnotherArray(
      [1,3,5],
      [2,3,4]
  ) yields [3], and it can work with strings too
*/
function reverseFilterArrayByAnotherArray(searchArray, filterArray) {
    if (
        // NOTE: This does not check the whole array. But, if you know
        //        that there are only strings or numbers (not a mix of
        //        both) in the array, then this is a safe assumption.
        typeof searchArray[0] == "number" &&
        typeof filterArray[0] == "number" &&
        (searchArray[0]|0) === searchArray[0] &&
        (filterArray[0]|0) === filterArray[0]
    ) {
        // if all entries in both arrays are integers
        searchArray.sort(sortIntArray);
        filterArray.sort(sortIntArray);
    } else {
        searchArray.sort(sortAnyArray);
        filterArray.sort(sortAnyArray);
    }
    // Progressive Linear Search
    var i = 0;
    return fastFilter(searchArray, function(currentValue){
        while (filterArray[i] < currentValue) i=i+1|0;
        // +undefined = NaN, which is always false for <, avoiding an infinite loop
        // For reverse filter, I changed !== to ===
        return filterArray[i] === currentValue;
    });
}

4
আপনার উত্তরের জন্য ধন্যবাদ, আমি নিশ্চিত যে তাড়াতাড়ি বা পরে কারও পক্ষে সহায়ক হবে, এমনকি এটি প্রান্তের ক্ষেত্রে ব্যবহার করা উচিত (IE শুধুমাত্র যখন কোনও পারফরম্যান্স সমস্যা উত্থাপিত হয়)। অন্যান্য সমস্ত ক্ষেত্রে আমি রক্ষণাবেক্ষণযোগ্য / পঠনযোগ্য সংস্করণটি ব্যবহার করার পরামর্শ দেব।
Koop4

1
@ জ্যাকগিফিন আমি মনে করি পাঠ্য হিসাবেই তাঁর অর্থ গড় ওয়েব বিকাশকারী দ্বারা পড়া এবং বোঝার জন্য ম্যান্ডেনটেবল এবং দ্রুত, কারণ যখন কোনও পরিবর্তন বা সাধারণ আন্ডার ট্যানিং প্রয়োজন হয়। দুর্দান্ত সমাধান, কেবল বেশিরভাগ ক্ষেত্রে নয়।
জর্দিলিয়র

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

1
@ জার্ডিলিয়ার এটি সত্যই সহায়তা করে। আপনার পরামর্শ জর্দিলিয়রের জন্য আপনাকে অনেক ধন্যবাদ। আমি এটিকে হৃদয়গ্রাহী করব এবং এর উপর আমল করব।
জ্যাক গিফিন

1
@ জ্যাকগিফিন সেবার হতে পেরে আনন্দিত
জারডিলিয়াল


1

filterফাংশন সেরা বর্ণনা https://developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Obiekty/Array/filter

আপনার কেবল শর্তের কাজটি করা উচিত:

function conditionFun(element, index, array) {
   return element >= 10;
}
filtered = [12, 5, 8, 130, 44].filter(conditionFun);

এবং ভেরিয়েবলটি নির্ধারিত হওয়ার আগে আপনি অ্যাক্সেস করতে পারবেন না


1

আপনি "ফিল্টার অ্যারে" এর পুনরাবৃত্তি করতে ফিল্টার ফাংশন সেটআপ করতে পারেন।

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

var filtered = arr.filter(
  function(val) {
    for (var i = 0; i < filter.length; i++) {
      if (val == filter[i]) {
        return false;
      }
    }
    return true;
  }
); 

1

আপনি ফিল্টারটি ব্যবহার করতে পারেন এবং তারপরে ফিল্টার ফাংশনটির জন্য ফিল্টারিং অ্যারের হ্রাস ব্যবহার করুন যা কোনও মিল খুঁজে পাওয়া যায় এবং তারপরে রিটার্ন (!) এ উল্টানো হলে সত্যটি ফিরে আসে। অ্যারের মধ্যে একবারে একবারে ফিল্টার ফাংশন বলা হয়। আপনি আপনার পোস্টে ফাংশনটিতে থাকা কোনও উপাদানের তুলনা করছেন না।

var a1 = [1, 2, 3, 4],
  a2 = [2, 3];

var filtered = a1.filter(function(x) {
  return !a2.reduce(function(y, z) {
    return x == y || x == z || y == true;
  })
});

document.write(filtered);


1

var arr1= [1,2,3,4];
var arr2=[2,4]

function fil(value){
return value !=arr2[0] &&  value != arr2[1]
}

document.getElementById("p").innerHTML= arr1.filter(fil)
<!DOCTYPE html> 
<html> 
<head> 
</head>
<body>
<p id="p"></p>


ধন্যবাদ, এটি কার্যকর, তবে আমি স্থানীয় সুযোগটি রাখতে পছন্দ করি। এছাড়াও এরি 2 এ এলোমেলো সংখ্যক উপাদান রয়েছে।
Koop4


1

অন্য অ্যারে থেকে আরও নমনীয় ফিল্টারিং অ্যারে যার মধ্যে অবজেক্ট বৈশিষ্ট্য রয়েছে

function filterFn(array, diffArray, prop, propDiff) {
    diffArray = !propDiff ? diffArray : diffArray.map(d => d[propDiff])
    this.fn = f => diffArray.indexOf(f) === -1
    if (prop) {
         return array.map(r => r[prop]).filter(this.fn)
    } else {
         return array.filter(this.fn)
    }
}

//You can use it like this;

var arr = [];

for (var i = 0; i < 10; i++) {
    var obj = {}
    obj.index = i
    obj.value = Math.pow(2, i)
    arr.push(obj)
}

var arr2 = [1, 2, 3, 4, 5]

var sec = [{t:2}, {t:99}, {t:256}, {t:4096}]

var log = console.log.bind(console)

var filtered = filterFn(arr, sec, 'value', 't')

var filtered2 = filterFn(arr2, sec, null, 't')

log(filtered, filtered2)


1

আপনি জেনেরিক ফিল্টারবাই ইন্ডেক্স () ফাংশন লিখতে পারেন এবং কলব্যাক ফাংশন দিয়ে ঝামেলা বাঁচাতে টিএস-তে টাইপ অনুমিত ব্যবহার করতে পারেন:

আসুন আমরা [২,৪] অ্যারেতে উল্লিখিত সূচীগুলির সাথে আপনার ([1,2,3,4] অ্যারে যা ফিল্টার করতে চান তা আছে) বলুন।

var filtered = [1,2,3,4,].filter(byIndex(element => element, [2,4]))

বাই ইনডেক্স ফাংশনটি উপাদান ফাংশন এবং একটি অ্যারের প্রত্যাশা করে এবং এর মতো দেখায়:

byIndex = (getter: (e:number) => number, arr: number[]) => (x: number) => {
    var i = getter(x);
    return arr.indexOf(i); 
}

ফলাফল তখন

filtered = [1,3]

1

নিম্নলিখিত উদাহরণগুলি new Set()ফিল্টারযুক্ত অ্যারে তৈরি করতে ব্যবহার করে যার মধ্যে কেবল অনন্য উপাদান রয়েছে:

প্রাথমিক তথ্য প্রকারের সাথে অ্যারে: স্ট্রিং, সংখ্যা, বুলিয়ান, নাল, অপরিজ্ঞাত, প্রতীক:

const a = [1, 2, 3, 4];
const b = [3, 4, 5];
const c = Array.from(new Set(a.concat(b)));

আইটেম হিসাবে বস্তুর সাথে অ্যারে:

const a = [{id:1}, {id: 2}, {id: 3}, {id: 4}];
const b = [{id: 3}, {id: 4}, {id: 5}];
const stringifyObject = o => JSON.stringify(o);
const parseString = s => JSON.parse(s);
const c = Array.from(new Set(a.concat(b).map(stringifyObject)), parseString);


0

জ্যাক গিফিনের সমাধানটি দুর্দান্ত তবে 2 ^ 32 এর চেয়ে বড় সংখ্যার অ্যারেগুলির জন্য কাজ করে না। নীচে জ্যাকের সমাধানের ভিত্তিতে একটি অ্যারে ফিল্টার করার জন্য একটি রিফ্যাক্টরড, দ্রুত সংস্করণ রয়েছে তবে এটি 64-বিট অ্যারেগুলির জন্য কাজ করে।

const Math_clz32 = Math.clz32 || ((log, LN2) => x => 31 - log(x >>> 0) / LN2 | 0)(Math.log, Math.LN2);

const filterArrayByAnotherArray = (searchArray, filterArray) => {

    searchArray.sort((a,b) => a > b);
    filterArray.sort((a,b) => a > b);

    let searchArrayLen = searchArray.length, filterArrayLen = filterArray.length;
    let progressiveLinearComplexity = ((searchArrayLen<<1) + filterArrayLen)>>>0
    let binarySearchComplexity = (searchArrayLen * (32-Math_clz32(filterArrayLen-1)))>>>0;

    let i = 0;

    if (progressiveLinearComplexity < binarySearchComplexity) {
      return searchArray.filter(currentValue => {
        while (filterArray[i] < currentValue) i=i+1|0;
        return filterArray[i] !== currentValue;
      });
    }
    else return searchArray.filter(e => binarySearch(filterArray, e) === null);
}

const binarySearch = (sortedArray, elToFind) => {
  let lowIndex = 0;
  let highIndex = sortedArray.length - 1;
  while (lowIndex <= highIndex) {
    let midIndex = Math.floor((lowIndex + highIndex) / 2);
    if (sortedArray[midIndex] == elToFind) return midIndex; 
    else if (sortedArray[midIndex] < elToFind) lowIndex = midIndex + 1;
    else highIndex = midIndex - 1;
  } return null;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.