Сортировка массива объектов javascript по свойству объекта
Hay, у меня есть массив объектов, и мне нужно отсортировать их (DESC или ASC) по определенному свойству каждого объекта.
вот данные
obj1 = new Object;
obj1.date = 1307010000;
obj2 = new Object;
obj2.date = 1306923600;
obj3 = new Object;
obj3.date = 1298974800;
obj4 = new Object;
obj4.date = 1306923600;
obj5 = new Object;
obj5.date = 1307096400;
data = [obj1,obj2,obj3,obj4,obj5];
теперь, я хочу заказать массив данных, чтобы объекты были в порядке по дате.
может кто-нибудь помочь мне с этим?
6 ответов
использовать массив сортировка() метод
data.sort(function(a, b){
return a.date - b.date;
});
Это решение работает с любым типом данных:
sort_array_by = function(field, reverse, pr){
reverse = (reverse) ? -1 : 1;
return function(a,b){
a = a[field];
b = b[field];
if (typeof(pr) != 'undefined'){
a = pr(a);
b = pr(b);
}
if (a<b) return reverse * -1;
if (a>b) return reverse * 1;
return 0;
}
}
затем используйте его следующим образом (обратная сортировка):
data.sort(sort_array_by('date', true, function(a){
return new Date(a);
}));
в качестве другого примера вы можете отсортировать его по свойству типа "integer":
data.sort(sort_array_by('my_int_property', true, function(a){
return parseInt(a);
}));
вы можете использовать пользовательскую функцию сортировки:
function mySort(a,b) {
return (a.date - b.date);
}
data.sort(mySort);
У нас есть приложение, использующее Angular/TypeScript, и оно немного легче на глазах с помощью функции стрелки. В нашем случае, следующий код является примером того, что у нас есть:
data.sort((a, b) => a.SortOrder - b.SortOrder);
Не огромное изменение, но это помогает moreso, когда у вас есть много объектов для сортировки.
Это пример того, как я использую сортировку массива объектов в порядке возрастания здесь "массив" - это массив объекта.скопируйте вставку в тег скрипта и поймите работу через консоль...
function OBJECT(){
this.PROPERTY1 =Math.floor(Math.random()*10+1) ;
}
OBJECT.prototype.getPROPERTY1=function (){
return(this.PROPERTY1);
}
OBJECT.prototype.setPROPERTY1=function (PROPERTY){
this.PROPERTY1=PROPERTY;
}
var array= new Array();
console.log("unsorted object")
for(var a=0;a<10;a++)
{
array.push(new OBJECT());
console.log(array[a].getPROPERTY1())
}
function sorting() {
for(var i in array){
array[i].setPROPERTY1((array[i].getPROPERTY1()*1))
//that is just for sorting an integer value escape this line if not an
//integer property
}
var arr=new(Array);
var temp1=new(Array);
for(var i in array){
temp1.push(array[i]);
}
var temporary=new(Array)
for(var i in array)
{
var temp = array[i].getPROPERTY1();
arr.push(temp);
}
arr.sort(function(a,b){return a-b});
//the argument above is very important
console.log(arr)
for(var i in arr){
for(var j in temp1)
if(arr[i]==temp1[j].getPROPERTY1())
break;
temporary.push(temp1[j])
temp1.splice(j,1)//just this statement works for me
}
array.length=0;
for(var i in temporary)
{
array.push(temporary[i])
}
}
sorting();
console.log("sorted object")
for(var a=0;a<10;a++)
{
console.log(array[a].getPROPERTY1())
}