按属性值对对象进行排序

IT技术 javascript arrays sorting oop properties
2021-01-14 16:17:33

如何仅使用 Javascript 实现以下场景:

  • 创建具有属性(最高速度、品牌等)汽车对象
  • 对按这些属性排序的汽车列表进行排序
6个回答

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 

好的,从你的评论中我看到你在错误的意义上使用了“排序”这个词。在编程中,“排序”的意思是“按一定顺序排列”,而不是“按组排列”。后者要简单得多——这就是你在现实世界中“排序”事物的方式

  • 制作两个空数组(“盒子”)
  • 对于列表中的每个对象,检查它是否符合条件
  • 如果是,把它放在第一个“盒子”里
  • 如果不是,把它放在第二个“盒子”里
另请注意,此解决方案仅适用于您排序的属性是数字时。这适用于按最高速度排序的示例,但如果您想按汽车品牌排序,则此解决方案不会按字母顺序对字符串进行排序。Cheeso 提供了按数字和字符串排序的答案。
2021-03-15 16:17:33
为方便起见,简单说明:this ( a.someProp - b.someProp) 从低到高排序,而 reverse ( b.someProp - a.someProp) 从高到低排序。基本上,如果函数返回小于 0,则 a 出现在 b 之前。
2021-03-28 16:17:33
另请注意,当数字非常高或非常低时,即当减法运算下溢时,排序将不起作用。
2021-04-05 16:17:33

例子。

这在 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");

你也可以做一个通用的分拣机。

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");

我为自己编写了这个简单的函数:

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');

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

// 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);

假设我们必须根据特定属性按升序对对象列表进行排序,在此示例中假设我们必须根据“名称”属性进行排序,那么下面是所需的代码:

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"}]
我想你有一个错字?return a["name"].localeCompare(b.["name"]); 应该返回 a["name"].localeCompare(b["name"]); (在 b 之后删除 .)
2021-04-01 16:17:33