বৈশিষ্ট্যের উপর ভিত্তি করে কীভাবে অবজেক্ট অ্যারে ফিল্টার করবেন?


472

আমার কাছে রিয়েল এস্টেট হোম সামগ্রীর নীচে জাভাস্ক্রিপ্ট অ্যারে রয়েছে:

var json = {
    'homes': [{
            "home_id": "1",
            "price": "925",
            "sqft": "1100",
            "num_of_beds": "2",
            "num_of_baths": "2.0",
        }, {
            "home_id": "2",
            "price": "1425",
            "sqft": "1900",
            "num_of_beds": "4",
            "num_of_baths": "2.5",
        },
        // ... (more homes) ...     
    ]
}

var xmlhttp = eval('(' + json + ')');
homes = xmlhttp.homes;

আমি যা করতে চাই তা হল "হোম" অবজেক্টগুলির একটি উপসেটটি ফেরত দেওয়ার জন্য অবজেক্টে ফিল্টার সম্পাদন করতে সক্ষম।

উদাহরণস্বরূপ, আমি এর উপর ভিত্তি করে ফিল্টার পাবে চাই: price, sqft, num_of_beds, এবং num_of_baths

আমি জাভাস্ক্রিপ্টে নীচের সিউডো কোডের মতো কিছু সম্পাদন করতে পারি:

var newArray = homes.filter(
    price <= 1000 & 
    sqft >= 500 & 
    num_of_beds >=2 & 
    num_of_baths >= 2.5 );

দ্রষ্টব্য, বাক্য গঠনটি ঠিক উপরের মতো হতে হবে না। এইটা শুধুমাত্র একটা উদাহরণ.



3
var json = { ... }JSON ডেটা এক্সচেঞ্জের জন্য একটি পাঠ্য স্বরলিপি(আরও এখানে।) আপনি যদি জাভাস্ক্রিপ্ট উত্স কোড নিয়ে কাজ করছেন এবং কোনও স্ট্রিংয়ের সাথে ডিল করছেন না, আপনি JSON এর সাথে কাজ করছেন না।
টিজে ক্রাউডার

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

উত্তর:


716

আপনি Array.prototype.filterপদ্ধতিটি ব্যবহার করতে পারেন :

var newArray = homes.filter(function (el) {
  return el.price <= 1000 &&
         el.sqft >= 500 &&
         el.num_of_beds >=2 &&
         el.num_of_baths >= 2.5;
});

সরাসরি উদাহরণ:

এই পদ্ধতিটি নতুন ইসমাস্ক্রিপ্টের 5 তম সংস্করণ মানের একটি অংশ এবং প্রায় সমস্ত আধুনিক ব্রাউজারে পাওয়া যাবে।

আই আই এর জন্য, আপনি সামঞ্জস্যের জন্য নিম্নলিখিত পদ্ধতিটি অন্তর্ভুক্ত করতে পারেন:

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

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

8
/ *, এইপ * / কী?
জেগ্রেগ

2
@ জেগ্রিগ: কেবলমাত্র একটি মন্তব্য যা ইঙ্গিত করে যে indicateচ্ছিক যুক্তিটি পাস হতে পারে, তর্কটি সরাসরি নির্দিষ্ট করা হয়নি কারণ ইসিএমএ স্ট্যান্ডার্ডটি স্পষ্টভাবে বলেছে যে এই পদ্ধতিতে কেবল একটি যুক্তি আশা করা উচিত ( Array.prototype.filter.length == 1;)। আপনি যখন দ্বিতীয় তর্কটি ব্যবহার করেন, এটি thisকলব্যাক ফাংশনের অভ্যন্তরের মান হিসাবে ব্যবহৃত হবে ।
সিএমএস

1
@ সিএমএস, আপনি কি নিশ্চিত যে এই কোডটি কাজ করে? এটি একটি খালি অ্যারে ফিরিয়ে দিচ্ছে, এমনকি যখন আমি দামটি সত্যই উচ্চতর এবং বর্গফুট / বিছানা / স্নানগুলি সত্যই কম রাখি। আপনি কি নিশ্চিত যে এই কোডটি কাজ করে?
জেগ্রেগ

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

2
@ সিএমএস এটি উত্তম হবে যদি উত্তরে একটি নতুন অ্যারে ফিরে আসে তবে আসল অ্যারেটি পরিবর্তন হয় না। যদিও প্রদত্ত লিঙ্কটিতে এটি বলা হয়েছে, আমি এটি ছাড়া উত্তরটি অসম্পূর্ণ বা ভুল বলে মনে করি
জি ওয়ার্কিং

29

আপনি jLinq এর মত কাঠামো ব্যবহার করার চেষ্টা করতে পারেন - নীচে jLinq ব্যবহারের কোড নমুনা

var results = jLinq.from(data.users)
.startsWith("first", "a")
.orEndsWith("y")
.orderBy("admin", "age")
.select();

আরও তথ্যের জন্য আপনি http://www.hugoware.net/projects/jlinq লিঙ্কটি অনুসরণ করতে পারেন


26

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

var newArray = homes.filter(
    price <= 1000 & 
    sqft >= 500 &
    num_of_beds >=2 & 
    num_of_baths >= 2.5);

ওভাররাইট করা যেতে পারে যেমন:

var newArray = _.filter (homes, function(home) {
    return home.price<=1000 && sqft>=500 && num_of_beds>=2 && num_of_baths>=2.5;
});

আশা করি এটি আপনার পক্ষে কার্যকর হবে!


এই আন্ডারস্কোর জিনিসটি কীভাবে কাজ করে এবং এর সঠিক অর্থ কী?
জন দেমেট্রিও

4
সবেমাত্র সন্ধান করা হয়েছে underscore-query( github.com/davidgtonge/underscore-query ) যা জাভাস্ক্রিপ্ট অ্যারেগুলি জিজ্ঞাসা করার জন্য মঙ্গোডিবির মতো সিনট্যাক্স ব্যবহার করে। সুতরাং আপনি এখানে ব্যবহার করতে চান_.query(homes, {price: {$lt:1000}, sqft: {$gte: 500}, num_of_beds: {$gte:2}, num_of_baths: {$gte: 2.5}}
19-18

12

আমি অবাক হয়েছি কেউই এক-লাইনের প্রতিক্রিয়া পোস্ট করেনি:

const filteredHomes = json.homes.filter(x => x.price <= 1000 && x.sqft >= 500 && x.num_of_beds >=2 && x.num_of_baths >= 2.5);

... এবং ঠিক তাই আপনি এটি আরও সহজভাবে পড়তে পারেন:

const filteredHomes = json.homes.filter( x => 
  x.price <= 1000 && 
  x.sqft >= 500 && 
  x.num_of_beds >=2 && 
  x.num_of_baths >= 2.5
);

2
সম্ভবত এটি কেবল তীর ফাংশন সহ সিএমএসের উত্তর হিসাবে একই
18:38 এরিচ

11

এখানে কাজের ভারসাম্য যা আইকিউ জ্যাকোরি এমএপি ফাংশনটি ব্যবহার করে সূক্ষ্মভাবে কাজ করে

http://jsfiddle.net/533135/Cj4j7/

json.HOMES = $.map(json.HOMES, function(val, key) {
    if (Number(val.price) <= 1000
            && Number(val.sqft) >= 500
            && Number(val.num_of_beds) >=2
            && Number(val.num_of_baths ) >= 2.5)
        return val;
});


7

আপনি এটি খুব সহজেই করতে পারেন - আপনি বেছে নিতে পারেন এমন অনেকগুলি বাস্তবায়ন সম্ভবত রয়েছে তবে এটি আমার প্রাথমিক ধারণা (এবং সম্ভবত এমন কিছু ফর্ম্যাট রয়েছে যেখানে আপনি jQuery দিয়ে কোনও বস্তুর উপরে পুনরাবৃত্তি করতে পারেন, আমি এখনই এটি সম্পর্কে ভাবতে পারি না):

function filter(collection, predicate)
{
    var result = new Array();
    var length = collection.length;

    for(var j = 0; j < length; j++)
    {
        if(predicate(collection[j]) == true)
        {
             result.push(collection[j]);
        }
    }

    return result;
}

এবং তারপরে আপনি এইভাবে এই ফাংশনটি শুরু করতে পারেন:

filter(json, function(element)
{
    if(element.price <= 1000 && element.sqft >= 500 && element.num_of_beds > 2 && element.num_of_baths > 2.5)
        return true;

    return false;
});

এইভাবে, আপনি যে প্রাক্কলনটি নির্ধারণ করেন তার উপর ভিত্তি করে আপনি ফিল্টারটি শুরু করতে পারেন, বা এমনকি ছোট ফিল্টারগুলি ব্যবহার করে একাধিকবার ফিল্টার করতে পারেন।


প্রথম স্নিপেটে দয়া করে "ইনট দৈর্ঘ্য "টিকে" ভার দৈর্ঘ্য "এ পরিবর্তন করুন
মালে দেশাই

4

আপনি নিজের ফিল্টার পদ্ধতি প্রয়োগ করতে পারেন যা আপনার প্রয়োজনগুলি পূরণ করে, এখানে কীভাবে:

function myfilter(array, test){
    var passedTest =[];
    for (var i = 0; i < array.length; i++) {
       if(test( array[i]))
          passedTest.push(array[i]);
    }

    return passedTest;
}

var passedHomes = myfilter(homes,function(currentHome){
     return ((currentHome.price <= 1000 )&& (currentHome.sqft >= 500 )&&(currentHome.num_of_beds >=2 )&&(currentHome.num_of_baths >= 2.5));
});

আশা করি এটা সাহায্য করবে!


আমার প্রাকটিক অবস্থাটি বিভিন্ন অন্লিক থেকে পরিবর্তিত হয়। কীভাবে বর্তমান প্রাকটিক মানগুলি সংরক্ষণ করতে এবং যখনই আমি চাইব এটি মাইফিল্টার ফাংশনে প্রয়োগ করতে পারি?
মালয় দেশাই

3

আপনার OGX.List পরীক্ষা করা উচিত যা ফিল্টারিং পদ্ধতিতে তৈরি হয়েছে এবং মানক জাভাস্ক্রিপ্ট অ্যারে প্রসারিত করে (এবং গ্রুপিং, বাছাই এবং অনুসন্ধান)) এটি ফিল্টারগুলির জন্য সমর্থনকারী অপারেটরগুলির একটি তালিকা এখানে রয়েছে:

'eq' //Equal to
'eqjson' //For deep objects, JSON comparison, equal to
'neq' //Not equal to
'in' //Contains
'nin' //Doesn't contain
'lt' //Lesser than
'lte' //Lesser or equal to
'gt' //Greater than
'gte' //Greater or equal to
'btw' //Between, expects value to be array [_from_, _to_]
'substr' //Substring mode, equal to, expects value to be array [_from_, _to_, _niddle_]
'regex' //Regex match

আপনি এটি এভাবে ব্যবহার করতে পারেন

  let list = new OGX.List(your_array);
  list.addFilter('price', 'btw', 100, 500);
  list.addFilter('sqft', 'gte', 500);
  let filtered_list = list.filter();

বা এমনকি এইভাবে

  let list = new OGX.List(your_array);
  let filtered_list = list.get({price:{btw:[100,500]}, sqft:{gte:500}});

বা ওয়ান লাইনার হিসাবে

   let filtered_list = new OGX.List(your_array).get({price:{btw:[100,500]}, sqft:{gte:500}});

2

অথবা আপনি কেবল ব্যবহার করতে পারেন $.each(যা কেবল অ্যারেগুলির জন্যও কাজ করে না) এবং এর মতো একটি নতুন অ্যারে তৈরি করতে পারেন:

var json = {
    'homes': [{
            "home_id": "1",
            "price": "925",
            "sqft": "1100",
            "num_of_beds": "2",
            "num_of_baths": "2.0",
        }, {
            "home_id": "2",
            "price": "1425",
            "sqft": "1900",
            "num_of_beds": "4",
            "num_of_baths": "2.5",
        },
        // ... (more homes) ...     
        {
            "home_id": "3-will-be-matched",
            "price": "925",
            "sqft": "1000",
            "num_of_beds": "2",
            "num_of_baths": "2.5",
        },
    ]
}

var homes = [];
$.each(json.homes, function(){
    if (this.price <= 1000
        && this.sqft >= 500
        && this.num_of_beds >= 2
        && this.num_of_baths >= 2.5
    ) {
        homes.push(this);
    }
});

2

আমি নির্দিষ্ট অযাচিত সম্পত্তি মানেরruleOut উপর ভিত্তি করে অবজেক্ট ফিল্টার করার জন্য আমার ফাংশনটি ব্যবহার করি আমি বুঝতে পারি যে আপনার উদাহরণে আপনি মানগুলির পরিবর্তে শর্তাদি ব্যবহার করতে চান তবে আমার উত্তর প্রশ্নের শিরোনামের জন্য বৈধ, সুতরাং আমি আমার পদ্ধতিটি এখানে রেখে যেতে চাই।

function ruleOut(arr, filterObj, applyAllFilters=true) {    
    return arr.filter( row => {            
        for (var field in filterObj) {
            var val = row[field];
            if (val) {                    
                if (applyAllFilters && filterObj[field].indexOf(val) > -1) return false;                
                else if (!applyAllFilters) {                        
                    return filterObj[field].filter(function(filterValue){ 
                        return (val.indexOf(filterValue)>-1);
                    }).length == 0;                 
                }
            }
        }
        return true;
    });
}

বলুন আপনার মত অভিনেতাদের একটি তালিকা রয়েছে:

let actors = [
  {userName:"Mary", job:"star", language:"Turkish"},
  {userName:"John", job:"actor", language:"Turkish"},
  {userName:"Takis", job:"star", language:"Greek"},
  {userName:"Joe", job:"star", language:"Turkish"},
  {userName:"Bill", job:"star", language:"Turkish"}
];

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

let unwantedFieldsFilter= { 
  userName: ['Mary', 'Joe'],    
  job: ['actor'],   
  language: ['English', 'Italian', 'Spanish', 'Greek']  
};

ঠিক আছে, এখন ruleOut(actors, unwantedFieldsFilter)আপনি যদি কেবল পেতেন

[{ব্যবহারকারী নাম: "বিল", কাজ: "তারা", ভাষা: "তুর্কি"}]

এবং বিল আপনার মানুষ, যেহেতু তাঁর নাম 'মেরি', 'জো' এর মধ্যে একটি নয়, তার জাতীয়তা ['ইংলিশ', 'ইতালিয়ান', 'স্প্যানিশ', 'গ্রীক'] এর সাথে যুক্ত নয় তিনি একটি তারকা!

আমার পদ্ধতিতে একটি বিকল্প রয়েছে, এটি হ'ল applyAllFiltersএবং এটি ডিফল্টরূপে সত্য। যদি আপনি এই পরমটিকে মিথ্যা হিসাবে সেট করে নিয়ন্ত্রণ করার চেষ্টা করেন, তবে এটি 'ও' এর পরিবর্তে 'ও' ফিল্টারিং হিসাবে কাজ করবে। উদাহরণ: ruleOut(actors, {job:["actor"], language:["Italian"]}, false)আপনাকে অভিনেতা বা ইতালিয়ান নয় এমন প্রত্যেককে আপনি পেয়ে যাবেন:

[{ব্যবহারকারী নাম: "মেরি", কাজ: "তারা", ভাষা: "তুর্কি"},
{ব্যবহারকারীর নাম: "টাকিস", কাজ: "তারা", ভাষা: "গ্রীক"},
{ব্যবহারকারীর নাম: "জো", কাজ: "তারা", ভাষা: "তুর্কি"},
{ব্যবহারকারী নাম: "বিল", কাজ: "তারা", ভাষা: "তুর্কি"}]


1
var filterHome = homes.filter(home =>
  return (home.price <= 999 &&
         home.num_of_baths >= 2.5 &&
         home.num_of_beds >=2 &&
         home.sqft >= 998));
console.log(filterHome);

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

@ জেগ্রিগ দয়া করে এটি দেখুন।


1
const x = JSON.stringify(data);
const y = 'search text';

const data = x.filter(res => {
        return(JSON.stringify(res).toLocaleLowerCase()).match(x.toLocaleLowerCase());
      });

0
const state.contactList = [{
    name: 'jane',
    email: 'jane@gmail.com'
  },{},{},...]

const fileredArray = state.contactsList.filter((contactItem) => {
  const regex = new RegExp(`${action.payload}`, 'gi');
  return contactItem.nameProperty.match(regex) || 
    contactItem.emailProperty.match(regex);
});


// contactList: all the contacts stored in state
// action.payload: whatever typed in search field
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.