2017-01-22 81 views
0

我有这样的对象数组;按数组排序对象数组

var orders = [ 
    { 
    status: "pending" 
    }, 
    { 
    status: "received" 
    }, 
    { 
    status: "sent" 
    }, 
    { 
    status: "pending" 
    } 
] 

我想解决这阵基础上status键的值的对象,但使对象的顺序status键的可能值的排列顺序相匹配;

var statuses = ["pending", "sent", "received"] 

因此,排序后,两个"pending"对象将是第一,其次是"sent"对象,最后是"received"对象。

我该怎么做?

+0

这将是更好,如果'statuses'是一个对象的索引的HashMap中,状态名称是属性名称,属性的值是分类权重。然后你的排序比较功能可能会差异的价值。 – Pointy

回答

0

你可以用sort()indexOf()来做到这一点。

var orders = [{ 
 
    status: "pending" 
 
}, { 
 
    status: "received" 
 
}, { 
 
    status: "sent" 
 
}, { 
 
    status: "pending" 
 
}] 
 
var statuses = ["pending", "sent", "received"] 
 

 
var result = orders.sort(function(a, b) { 
 
    return statuses.indexOf(a.status) - statuses.indexOf(b.status) 
 
}) 
 

 
console.log(result)

0

可以使用sort()功能:

var statuses = ["pending", "sent", "received"]; 
 
var orders = [ 
 
    { 
 
    status: "pending" 
 
    }, 
 
    { 
 
    status: "received" 
 
    }, 
 
    { 
 
    status: "sent" 
 
    }, 
 
    { 
 
    status: "pending" 
 
    } 
 
]; 
 

 
orders.sort(function(a, b) { 
 
    return statuses.indexOf(a.status) - statuses.indexOf(b.status); 
 
}); 
 

 
console.log(orders);

0

使用Array#sort方法对象的数组排序。在哪里使用对象来存储密钥的索引,这有助于避免使用方法(这是较慢的)。

var orders = [{ 
 
    status: "pending" 
 
}, { 
 
    status: "received" 
 
}, { 
 
    status: "sent" 
 
}, { 
 
    status: "pending" 
 
}]; 
 

 
var statuses = ["pending", "sent", "received"]; 
 

 
// generate the object which holds the index in array 
 
// or use an object instead of array which holds the index 
 
var index = statuses.reduce(function(obj, k, i) { 
 
    obj[k] = i; 
 
    return obj; 
 
}, {}) 
 

 
console.log(
 
    orders.sort(function(a, b) { 
 
    return index[a.status] - index[b.status]; 
 
    }) 
 
)

0

你可以使用一个对象作为哈希表的排序顺序。

var orders = [{ status: "pending" }, { status: "received" }, { status: "sent" }, { status: "pending" }], 
 
    statuses = { pending: 1, sent: 2, received: 3 }; 
 

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

 
console.log(orders);

0

可以用这样的方法indexOf()排序回调之内,但更有效的是要建立第一

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] 
})