2010-03-17 3 views
50

мне нужно сделать, это:Javascript список объектов сортировки по объекту недвижимости

(извините не в JavaScript синтаксически все еще учусь объектный язык :))

объект = автомобиль

: топ атрибуты объявления скорости , бренд ....

теперь я хочу, чтобы отсортировать список этих автомобилей, чтобы топ-скорости, бренд ...

Как я делаю это (обратите внимание на решение должно быть javascri pt только, не php или другие вещи)?

+3

@durilai: JavaScript ** ** является объектно-ориентированным, ОО модель JavaScript основан на * прототипирования * и действительно, на самом деле универсальны ... http://en.wikipedia.org/wiki/ Prototype-based_programming – CMS

+5

пахнет домашней работой? – Cheeso

+0

Я рекомендую использовать lodash.js: https: // lodash.com/docs # sortBy –

ответ

118

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 

нормально, от вашего комментария я вижу, что вы используете слово «сортировки» в неправильном смысле. В программировании «сортировка» означает «положить вещи в определенном порядке», а не «упорядочивать вещи в группах». Последнее гораздо проще - это просто, как вы «сортировать» вещи в реальном мире

  • сделать две пустые массивы («коробки»)
  • для каждого объекта в списке, проверьте, если он соответствует критериям
  • если да, то поставить его в первом «поле»
  • если нет, поставить его во втором «коробки»
+1

Кажется очень полезным, но я не уверен, что это будет делать, вы должны следить за этим: (скажем, например) if (колеса <15) { автомобильные колеса = малый; } еще { автомобиль колесо = большой } и чем создать 2 новые списки в зависимости от размера колеса – Constructor

+4

Простых нот для удобства: это ('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) – user568458

14

Пример.

Это работает на 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"); 
+0

Nice один. Но мне не нравятся вложенные тернарные выражения, а также блок else не обязательно нужен после возвращения. – Marcs

+0

Я подозреваю, что вы это знаете, но для людей, которые смотрят «новый автомобиль» («Чеви», «Corvair», 1800, 88, 2900), 'также может быть просто« Автомобиль »(« Чеви »,« Корвар », 1800, 88, 2900), 'без' нового'. Хороший ответ, я думаю. –

-1

Я написал эту простую функцию для себя:

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

почему этот комментарий проголосовали -2? Я думаю, что это хороший ответ, может быть, не самый ясный, но все же самый динамичный ответ. – wertigom

2

Вариант решения Cheeso с обратной сортировкой, я также удалены тройные выражения из-за отсутствия ясности (но это личный вкус).

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

Хорошо для обратного примера –

+1

Чтобы быть полностью отмененным, номерам нужно 'return !! reverse? (a [prop] - b [prop]) * -1: (a [prop] - b [prop]); ' –

+0

Да, поскольку теперь нет обратной проверки номеров, спасибо, я должен это исправить. Но почему двойное '!' Это тоже хорошо: 'return reverse? (a [prop] - b [prop]) * -1: (a [prop] - b [prop]); ' – Marcs

Смежные вопросы