संपत्ति मूल्यों द्वारा वस्तुओं को क्रमबद्ध करना


88

केवल जावास्क्रिप्ट का उपयोग करके निम्नलिखित परिदृश्य को कैसे लागू करें:

  • गुण (शीर्ष गति, ब्रांड आदि) के साथ एक कार ऑब्जेक्ट बनाएं
  • उन संपत्तियों द्वारा ऑर्डर की गई कारों की सूची को क्रमबद्ध करें

3
@durilai: जावास्क्रिप्ट है वस्तु उन्मुख, JavaScript का OO मॉडल पर आधारित है प्रोटोटाइप और है सच में, सच बहुमुखी ... en.wikipedia.org/wiki/Prototype-based_programming
ईसाई सी Salvado

मैं lodash.js का उपयोग करने की सलाह देता हूं: lodash.com/docs#sortBy
रासायनिक प्रोग्रामर

जवाबों:


159

जावास्क्रिप्ट में सॉर्ट फ़ंक्शन होता है जो दूसरे फ़ंक्शन को पैरामीटर के रूप में ले सकता है - उस दूसरे फ़ंक्शन का उपयोग दो तत्वों की तुलना करने के लिए किया जाता है।

उदाहरण:

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 

ठीक है, आपकी टिप्पणी से मैं देख रहा हूँ कि आप एक गलत अर्थ में 'सॉर्ट' शब्द का उपयोग कर रहे हैं। प्रोग्रामिंग में "सॉर्ट" का अर्थ है "चीजों को एक निश्चित क्रम में रखना", न कि "समूहों में चीजों को व्यवस्थित करना"। उत्तरार्द्ध बहुत सरल है - यह सिर्फ यही है कि आप वास्तविक दुनिया में चीजों को "क्रमबद्ध" कैसे करते हैं

  • दो खाली सरणियाँ ("बक्से") बनाएं
  • अपनी सूची में प्रत्येक वस्तु के लिए, यह जांच लें कि क्या यह मापदंड से मेल खाता है
  • यदि हाँ, तो इसे पहले "बॉक्स" में रखें
  • यदि नहीं, तो इसे दूसरे "बॉक्स" में डालें

10
सुविधा के लिए सरल नोट: यह ( a.someProp - b.someProp) निम्नतम से उच्चतम तक , और रिवर्स ( b.someProp - a.someProp) उच्चतम से निम्नतम तक क्रमबद्ध है। मूल रूप से, यदि फ़ंक्शन 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"}]

1
मुझे लगता है कि आपके पास एक टाइपो है? एक ["नाम"] लौटाएं। localeCompare (b। ["नाम"]); एक ["नाम"] लौटाया जाना चाहिए। localeCompare (बी ["नाम"]); (निकालें। बी के बाद)
लिटिल ब्रेन

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;
  };
};

1
पूरी तरह से उलट संख्याओं की जरूरत हैreturn !!reverse ? (a[prop] - b[prop]) * -1 : (a[prop] - b[prop]);
मार्क शुल्त्स

हां, जैसा कि अब संख्याओं पर कोई रिवर्स चेक नहीं है, धन्यवाद, मुझे इसे ठीक करना चाहिए। लेकिन यह डबल क्यों !ठीक है:return reverse ? (a[prop] - b[prop]) * -1 : (a[prop] - b[prop]);
Marcs

1
!!के रूप में जावास्क्रिप्ट मूल्य की "falsy" प्रकृति का विरोध करने के एक देशी बूलियन प्रकार मान बलों प्रकार बलात्कार, सख्ती की जरूरत है, लेकिन कम से कम मेरे लिए स्पष्ट उद्देश्य नहीं। ध्यान दें कि जब आप !!इसके साथ एक मान लौटाते हैं , तो एक देशी बुलियन प्रकार होता है, जो कि "फाल्सी" मूल्य के साथ एक देशी प्रकार के विपरीत होता है, जो कहने के लिए होता है typeof !!undefinedया typeof !!nullआदि "बूलियन" वापस करते हैं !!" ", trueलेकिन !!""यह नोट है false(स्थान, कोई स्थान नहीं है) स्ट्रिंग) लेकिन आप शायद पहले से ही जानते थे।
मार्क शुल्त्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.