Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按数组对对象数组进行排序_Javascript - Fatal编程技术网

Javascript 按数组对对象数组进行排序

Javascript 按数组对对象数组进行排序,javascript,Javascript,我有一系列这样的物体 var orders = [ { status: "pending" }, { status: "received" }, { status: "sent" }, { status: "pending" } ] 我想根据状态键的值对该对象数组进行排序,但要使对象的顺序与状态键的可能值数组的顺序相匹配 var statuses = ["pending", "sent", "received"] 因此,排序后,

我有一系列这样的物体

var orders = [
  {
    status: "pending"
  },
  {
    status: "received"
  },
  {
    status: "sent"
  },
  {
    status: "pending"
  }
]
我想根据
状态
键的值对该对象数组进行排序,但要使对象的顺序与
状态
键的可能值数组的顺序相匹配

var statuses = ["pending", "sent", "received"]
因此,排序后,两个
“挂起的”
对象将首先是
“发送的”
对象,然后是
“接收的”
对象


我怎样才能做到这一点?

您可以使用
sort()
indexOf()
来做到这一点

var订单=[{
状态:“待定”
}, {
状态:“已收到”
}, {
状态:“已发送”
}, {
状态:“待定”
}]
var状态=[“待定”、“已发送”、“已接收”]
var result=orders.sort(函数(a,b){
返回状态indexOf(a.status)-状态indexOf(b.status)
})
console.log(结果)
您可以使用
sort()
函数:

var状态=[“待定”、“已发送”、“已接收”];
风险值订单=[
{
状态:“待定”
},
{
状态:“已收到”
},
{
状态:“已发送”
},
{
状态:“待定”
}
];
排序(函数(a,b){
返回状态indexOf(a.status)-状态indexOf(b.status);
});
控制台日志(订单)使用方法对对象数组进行排序。其中使用对象存储键的索引,这有助于避免使用方法(速度较慢)

var订单=[{
状态:“待定”
}, {
状态:“已收到”
}, {
状态:“已发送”
}, {
状态:“待定”
}];
变量状态=[“待定”、“已发送”、“已接收”];
//生成在数组中保存索引的对象
//或者使用对象而不是保存索引的数组
var索引=状态。减少(功能(obj、k、i){
obj[k]=i;
返回obj;
}, {})
console.log(
排序(函数(a,b){
返回索引[a.status]-索引[b.status];
})

)
您可以使用对象作为排序顺序的哈希表

var orders=[{status:“pending”}、{status:“received”}、{status:“sent”}、{status:“pending”}],
状态={挂起:1,发送:2,接收:3};
排序(函数(a,b){
返回状态[a.status]-状态[b.status];
});

控制台日志(订单)可以在排序回调中使用类似于
indexOf()
的方法,但更有效的方法是首先构建索引的hashmap

var statIndex = statuses.reduce(function(a,c,i){
   a[c] = i;
   return a
},{})

orders.sort(function(a,b){
   return statIndex[a.status] - statIndex[b.status]
})

如果
status
是一个对象,状态名称为属性名称,属性值为排序权重,则效果更好。然后,排序比较函数就可以将这些值进行差异化。