我使用AJAX获取了以下对象,并将它们存储在数组中:
var homes = [
{
"h_id": "3",
"city": "Dallas",
"state": "TX",
"zip": "75201",
"price": "162500"
}, {
"h_id": "4",
"city": "Bevery Hills",
"state": "CA",
"zip": "90210",
"price": "319250"
}, {
"h_id": "5",
"city": "New York",
"state": "NY",
"zip": "00010",
"price": "962500"
}
];
如何创建一个函数,仅使用JavaScript按price属性按升序或降序对对象进行排序?
这是《JavaScript:TheGoodParts》一书中优雅实现的一个略微修改版本。
注意:此版本的by是稳定的。它在执行下一个链式排序时保留第一个排序的顺序。
我给它添加了isAscending参数。还将它转换为ES6标准和作者推荐的“更新”好部件。
您可以按多个财产进行升序排序、降序排序和链式排序。
const by=函数(name,minor,isAscending=true){constreverseMultliplier=isAscending?1 : -1;返回函数(o,p){设a,b;let结果;if(o&&p&&typeof o==“object”&&typeof p===“object”){a=o[名称];b=p[名称];如果(a===b){返回minor类型==“函数”?小调(o,p):0;}if(a的类型==b的类型){结果=a<b-1 : 1;}其他{结果=a的类型<b的类型-1 : 1;}返回结果*reverseMultilier;}其他{投掷,投掷{name:“错误”,消息:“按+name排序时需要一个对象”};}};};设s=[{first:“乔”,last:“贝瑟”},{first:“Moe”,last:“Howard”},{first:“Joe”,last:“DeRita”},{first:“Shemp”,last:“Howard”},{first:“Larry”,last:“Fine”},{第一个:“卷毛”,最后一个:“霍华德”}];//排序方式:第一个升序,最后一个升序s.sort(按(“first”,按(“last”)));console.log(“排序方式:第一个升序,最后一个升序:”,s);//"[//{“第一”:“卷毛”,“最后”:“霍华德”},//{“第一”:“乔”,“最后”:“贝瑟”}<======//{“第一”:“乔”,“最后”:“德丽塔”}<======//{“第一”:“拉里”,“最后”:“好”},//{“第一”:“莫”,“最后”:“霍华德”},//{“first”:“Shemp”,“last”:”Howard“}// ]//排序方式:第一个升序,最后一个降序s.sort(按(“first”,按(“last”,0,false)));console.log(“排序方式:第一个升序,最后一个降序:”,s);//"[//{“第一”:“卷毛”,“最后”:“霍华德”},//{“第一”:“乔”,“最后”:“德丽塔”}<========//{“第一”:“乔”,“最后”:“贝瑟”}<========//{“第一”:“拉里”,“最后”:“好”},//{“第一”:“莫”,“最后”:“霍华德”},//{“first”:“Shemp”,“last”:”Howard“}// ]
我最近编写了一个通用函数,如果您想使用它,可以为您管理它。
/**
* Sorts an object into an order
*
* @require jQuery
*
* @param object Our JSON object to sort
* @param type Only alphabetical at the moment
* @param identifier The array or object key to sort by
* @param order Ascending or Descending
*
* @returns Array
*/
function sortItems(object, type, identifier, order){
var returnedArray = [];
var emptiesArray = []; // An array for all of our empty cans
// Convert the given object to an array
$.each(object, function(key, object){
// Store all of our empty cans in their own array
// Store all other objects in our returned array
object[identifier] == null ? emptiesArray.push(object) : returnedArray.push(object);
});
// Sort the array based on the type given
switch(type){
case 'alphabetical':
returnedArray.sort(function(a, b){
return(a[identifier] == b[identifier]) ? 0 : (
// Sort ascending or descending based on order given
order == 'asc' ? a[identifier] > b[identifier] : a[identifier] < b[identifier]
) ? 1 : -1;
});
break;
default:
}
// Return our sorted array along with the empties at the bottom depending on sort order
return order == 'asc' ? returnedArray.concat(emptiesArray) : emptiesArray.concat(returnedArray);
}
你需要两个功能
function desc(a, b) {
return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
}
function asc(a, b) {
return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
}
然后可以将其应用于任何对象属性:
data.sort((a, b) => desc(parseFloat(a.price), parseFloat(b.price)));
让数据=[{label:“一”,值:10},{label:“two”,值:5},{label:“three”,值:1},];//排序函数函数desc(a,b){返回b<a-1:b>a?1:b>=a?0:NaN;}函数asc(a,b){返回a<b-1:a>b?1:a>=b?0:NaN;}//描述(DESC)data.sort((a,b)=>desc(a.value,b.value));document.body.insert相邻HTML('之前','<strong>DESC排序</strong><pre>'+JSON.stringify(数据)+'</pre>');//美国科学院data.sort((a,b)=>asc(a.value,b.value));document.body.insert相邻HTML('之前','<strong>ASCending sorted</strong><pre>'+JSON.stringify(数据)+'</pre>');