সম্পত্তি মান দ্বারা বস্তু বাছাই


88

কেবলমাত্র জাভাস্ক্রিপ্ট ব্যবহার করে কীভাবে নিম্নলিখিত পরিস্থিতিতে বাস্তবায়ন করতে হবে:

  • বৈশিষ্ট্য সহ একটি গাড়ী অবজেক্ট তৈরি করুন (শীর্ষ গতি, ব্র্যান্ড ইত্যাদি)
  • সেই বৈশিষ্ট্য দ্বারা অর্ডার করা গাড়িগুলির একটি তালিকা বাছাই করুন

4
@durilai: জাভাস্ক্রিপ্ট হয় অবজেক্ট ওরিয়েন্টেড, জাভাস্ক্রিপ্ট এর OO যেমন পণ্য মডেলের উপর ভিত্তি করে তৈরি প্রোটোটাইপিং এবং সত্যিই, সত্যিই বহুমুখী ... en.wikipedia.org/wiki/Prototype-based_programming
খ্রিস্টান সি Salvadó

আমি লড্যাশ.জেএস ব্যবহার করার পরামর্শ দিচ্ছি: লড্যাশ
কেমিক্যাল প্রোগ্রামার

উত্তর:


162

জাভাস্ক্রিপ্টে বাছাই করা ফাংশন রয়েছে যা প্যারামিটার হিসাবে অন্য ফাংশন নিতে পারে - যে দ্বিতীয় ফাংশনটি দুটি উপাদানের তুলনায় ব্যবহৃত হয়।

উদাহরণ:

cars = [

    {
        name: "Honda",
        speed: 80
    },

    {
        name: "BMW",
        speed: 180
    },

    {
        name: "Trabi",
        speed: 40
    },

    {
        name: "Ferrari",
        speed: 200
    }
]


cars.sort(function(a, b) { 
    return a.speed - b.speed;
})

for(var i in cars)
    document.writeln(cars[i].name) // Trabi Honda BMW Ferrari 

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

  • দুটি খালি অ্যারে ("বাক্স") তৈরি করুন
  • আপনার তালিকার প্রতিটি বস্তুর জন্য, এটি মানদণ্ডের সাথে মেলে কিনা তা পরীক্ষা করে দেখুন
  • যদি হ্যাঁ, এটি প্রথম "বাক্সে" রাখুন
  • যদি না হয় তবে এটি দ্বিতীয় "বাক্সে" রাখুন

11
সুবিধার জন্য সরল নোট: এটি ( a.someProp - b.someProp) সর্বনিম্ন থেকে সর্বোচ্চ এবং বিপরীত ( b.someProp - a.someProp) সর্বাধিক থেকে নিম্নতম পর্যন্ত সাজায় orts মূলত, যদি ফাংশনটি 0 এর চেয়ে কম ফিরে আসে তবে খ এর আগে একটি আসে।
user56reinstatemonica8

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

23

উদাহরণ।

এটি উইন্ডোতে cscript.exe- এ চলে।

// define the Car class
(function() {
    // makeClass - By John Resig (MIT Licensed)
    // Allows either new User() or User() to be employed for construction.
    function makeClass(){
        return function(args){
            if ( this instanceof arguments.callee ) {
                if ( typeof this.init == "function" )
                    this.init.apply( this, (args && args.callee) ? args : arguments );
            } else
                return new arguments.callee( arguments );
        };
    }

    Car = makeClass();

    Car.prototype.init = function(make, model, price, topSpeed, weight) {
        this.make = make;
        this.model = model;
        this.price = price;
        this.weight = weight;
        this.topSpeed = topSpeed;
    };
})();


// create a list of cars
var autos = [
    new Car("Chevy", "Corvair", 1800, 88, 2900),
    new Car("Buick", "LeSabre", 31000, 138, 3700),
    new Car("Toyota", "Prius", 24000, 103, 3200),
    new Car("Porsche", "911", 92000, 155, 3100),
    new Car("Mercedes", "E500", 67000, 145, 3800),
    new Car("VW", "Passat", 31000, 135, 3700)
];

// a list of sorting functions
var sorters = {
    byWeight : function(a,b) {
        return (a.weight - b.weight);
    },
    bySpeed : function(a,b) {
        return (a.topSpeed - b.topSpeed);
    },
    byPrice : function(a,b) {
        return (a.price - b.price);
    },
    byModelName : function(a,b) {
        return ((a.model < b.model) ? -1 : ((a.model > b.model) ? 1 : 0));
    },
    byMake : function(a,b) {
        return ((a.make < b.make) ? -1 : ((a.make > b.make) ? 1 : 0));
    }
};

function say(s) {WScript.Echo(s);}

function show(title)
{
    say ("sorted by: "+title);
    for (var i=0; i < autos.length; i++) {
        say("  " + autos[i].model);
    }
    say(" ");
}

autos.sort(sorters.byWeight);
show("Weight");

autos.sort(sorters.byModelName);
show("Name");

autos.sort(sorters.byPrice);
show("Price");

আপনি একটি সাধারণ বাছাই করতে পারেন।

var byProperty = function(prop) {
    return function(a,b) {
        if (typeof a[prop] == "number") {
            return (a[prop] - b[prop]);
        } else {
            return ((a[prop] < b[prop]) ? -1 : ((a[prop] > b[prop]) ? 1 : 0));
        }
    };
};

autos.sort(byProperty("topSpeed"));
show("Top Speed");

13

আমি এই সহজ ফাংশনটি নিজের জন্য লিখেছি:

function sortObj(list, key) {
    function compare(a, b) {
        a = a[key];
        b = b[key];
        var type = (typeof(a) === 'string' ||
                    typeof(b) === 'string') ? 'string' : 'number';
        var result;
        if (type === 'string') result = a.localeCompare(b);
        else result = a - b;
        return result;
    }
    return list.sort(compare);
}

উদাহরণস্বরূপ আপনার গাড়ীর তালিকা রয়েছে:

var cars= [{brand: 'audi', speed: 240}, {brand: 'fiat', speed: 190}];
var carsSortedByBrand = sortObj(cars, 'brand');
var carsSortedBySpeed = sortObj(cars, 'speed');

6

আসুন আমরা বলতে পারি যে কোনও নির্দিষ্ট সম্পত্তির উপর ভিত্তি করে আমাদের ক্রমবর্ধমান ক্রমে অবজেক্টগুলির একটি তালিকা বাছাই করতে হবে, উদাহরণস্বরূপ বলতে দিন যে "নাম" বৈশিষ্ট্যের ভিত্তিতে আমাদের বাছাই করতে হবে, তারপরে প্রয়োজনীয় কোডটি নীচে রয়েছে:

var list_Objects = [{"name"="Bob"},{"name"="Jay"},{"name"="Abhi"}];
Console.log(list_Objects);   //[{"name"="Bob"},{"name"="Jay"},{"name"="Abhi"}]
    list_Objects.sort(function(a,b){
        return a["name"].localeCompare(b["name"]); 
    });
Console.log(list_Objects);  //[{"name"="Abhi"},{"name"="Bob"},{"name"="Jay"}]

4
আমার মনে হয় আপনার টাইপো আছে? একটি ["নাম"] ফেরান loc একটি ["নাম"] ফিরিয়ে আনা উচিত loc লোকালকম্পার (খ ["নাম"]); (বি। এর পরে অপসারণ করুন)
লিটল ব্রেন

3

সঙ্গে ES6 তীর ফাংশন এটা ভালো হবে:

//Let's say we have these cars
let cars = [ { brand: 'Porsche', top_speed: 260 },
  { brand: 'Benz', top_speed: 110 },
  { brand: 'Fiat', top_speed: 90 },
  { brand: 'Aston Martin', top_speed: 70 } ]

Array.prototype.sort() একটি তুলনামূলক ফাংশন গ্রহণ করতে পারে (এখানে আমি তীর চিহ্ন চিহ্নিত করেছি, তবে সাধারণ ফাংশনগুলি একই কাজ করে):

let sortedByBrand = [...cars].sort((first, second) => first.brand > second.brand)

// [ { brand: 'Aston Martin', top_speed: 70 },
//   { brand: 'Benz', top_speed: 110 },
//   { brand: 'Fiat', top_speed: 90 },
//   { brand: 'Porsche', top_speed: 260 } ]

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

let sortedBySpeed =[...cars].sort((first, second) => first.top_speed > second.top_speed)

//[ { brand: 'Aston Martin', top_speed: 70 },
//  { brand: 'Fiat', top_speed: 90 },
//  { brand: 'Benz', top_speed: 110 },
//  { brand: 'Porsche', top_speed: 260 } ]

আপনি যদি মনে করেন না যে অরজিনাল অ্যারেটি পরিবর্তন cars.sort(comparatorFunction)করতে পারেন তবে কৌশলটি করবে।


3

এখানে একটি সংক্ষিপ্ত উদাহরণ রয়েছে, যা বস্তু তৈরি করে এবং অ্যারে তৈরি করে, এবং সংখ্যাসূচক বা বর্ণানুক্রমিকভাবে সাজান:

// Create Objects Array

var arrayCarObjects = [
{brand: "Honda",        topSpeed: 45},
{brand: "Ford",         topSpeed: 6},
{brand: "Toyota",       topSpeed: 240},
{brand: "Chevrolet",    topSpeed: 120},
{brand: "Ferrari",      topSpeed: 1000}
];

// Sort Objects Numerically

arrayCarObjects.sort((a, b) => (a.topSpeed - b.topSpeed));

// Sort Objects Alphabetically

arrayCarObjects.sort((a, b) => (a.brand > b.brand) ? 1 : -1);

2

বিপরীত বাছাইয়ের সাথে চিজো সমাধানের একটি সংস্করণ, আমি স্বচ্ছতার অভাবের জন্য তিনটি প্রকাশগুলিও সরিয়েছি (তবে এটি ব্যক্তিগত স্বাদ)।

function(prop, reverse) {
  return function(a, b) {
    if (typeof a[prop] === 'number') {
      return (a[prop] - b[prop]);
    }

    if (a[prop] < b[prop]) {
      return reverse ? 1 : -1;
    }

    if (a[prop] > b[prop]) {
      return reverse ? -1 : 1;
    }

    return 0;
  };
};

4
নম্বরগুলি পুরোপুরি উল্টে return !!reverse ? (a[prop] - b[prop]) * -1 : (a[prop] - b[prop]);
ফেলার জন্য

হ্যাঁ, এখন পর্যন্ত সংখ্যার কোনও বিপরীত চেক নেই, আপনাকে ধন্যবাদ, আমার এটি ঠিক করা উচিত। তবে কেন দ্বিগুণ !এটি খুব ভাল:return reverse ? (a[prop] - b[prop]) * -1 : (a[prop] - b[prop]);
মার্কস

4
!!যেমন জাভাস্ক্রিপ্ট মান "falsy" প্রকৃতির বিরোধিতা একটি নেটিভ বুলিয়ান টাইপ মান বাহিনী জাভাস্ক্রিপ্টের এই মাতব্বরী, কঠোরভাবে প্রয়োজন কিন্তু অন্তত আমার কাছে সুস্পষ্ট করে দিয়েছেন উদ্দেশ্য নয়। মনে রাখবেন আপনি যখন কোন মান ফিরিয়ে দিয়ে !!এটা একটি নেটিভ বুলিয়ান টাইপ একটি "falsy" মান যা বলতে হয় সঙ্গে একটি নেটিভ ধরনের বিরোধিতা typeof !!undefinedবা typeof !!nullইত্যাদি আয় "বুলিয়ান" লক্ষ্য করুন !!" "নেই trueকিন্তু !!""হয় false(স্থান, কোন স্থান স্ট্রিং) তবে আপনি সম্ভবত এটি জানেন।
মার্ক শুলথিস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.