按对象属性排序的Javascript对象列表

Con*_*tor 77 javascript arrays sorting oop properties

我需要这样做:

(抱歉没有javascript语法 - 仍在学习对象语言:))

对象=车

attibutes:顶级品牌....

现在我想按照最高速度,品牌顺序排列这些车的清单......

我该怎么做(请注意解决方案必须只是javascript,没有PHP或其他东西)?

use*_*291 153

javascript具有sort函数,可以将另一个函数作为参数 - 第二个函数用于比较两个元素.

例:

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 
Run Code Online (Sandbox Code Playgroud)

好的,从你的评论中我发现你在错误的意义上使用了"排序"这个词.在编程中,"排序"意味着"按某种顺序放置东西",而不是"按组排列".后者更简单 - 这就是你在现实世界中"排序"事物的方式

  • 制作两个空数组("盒子")
  • 对于列表中的每个对象,检查它是否与条件匹配
  • 如果是的话,把它放在第一个"盒子里"
  • 如果没有,把它放在第二个"盒子"

  • 为方便起见,简单说明:这个(`a.someProp - b.someProp`)从**最低到最高**排序,反向(`b.someProp - a.someProp`)从最高到最低排序.基本上,[如果函数返回小于0,则a来自b.](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Description) (8认同)

Che*_*eso 21

例.

这在Windows上的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");
Run Code Online (Sandbox Code Playgroud)

您也可以制作一般的分拣机.

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");
Run Code Online (Sandbox Code Playgroud)


sla*_*gan 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);
}
Run Code Online (Sandbox Code Playgroud)

例如,你有汽车列表:

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


Jay*_*h G 5

假设我们必须基于特定属性按升序对对象列表进行排序,在本示例中,我们不得不基于“ name”属性进行排序,然后下面是所需代码:

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"}]
Run Code Online (Sandbox Code Playgroud)


the*_*axx 5

这是一个简短的示例,它创建对象数组,并按数字或字母顺序排序:

// 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);
Run Code Online (Sandbox Code Playgroud)