javascript - 对对象字面量数组进行排序
问题描述
我有这个对象数组。我正在尝试按给定的顺序或顺序重新排列它们。
例如,如果我说油应该按顺序排列 = 1,那么油的对象应该排在最前面,如果我说汽油应该按顺序排列 = 3,那么汽油的对象应该排在第三位。
到目前为止,这是我尝试过的,但我没有得到正确的结果:
这里还有一个工作的jsfiddle:
https://jsfiddle.net/voqgs7j8/
var utilities = {
"petrol": {
"title": "Petrol",
"price": 10
},
"oil": {
"title": "Oil",
"price": 12
},
"sugar": {
"title": "Sugar",
"price": 14
},
"flour": {
"title": "Flour",
"price": 65
} ,
"apple": {
"title": "apple",
"price": 20
} ,
"banana": {
"title": "banana",
"price": 30
} ,
"orange": {
"title": "orange",
"price": 19
}
};
//var getUtilityUserPreferences = {utilityOrders: []};// to test empty DB values
var getUtilityUserPreferences = {utilityOrders: [{"utility": "petrol", "order": 5}, {"utility": "oil", "order": 1}, {"utility": "flour", "order": 2}]};
var response = utilities;// by default it holds all same ordered values
if(getUtilityUserPreferences && getUtilityUserPreferences.utilityOrders && getUtilityUserPreferences.utilityOrders.length){
// OH we found user defined orders, so calculation starts with empty response
var response = {};
var resPointer = 1;// holds current index of final response, where the obj will be pushed
var dbArrIndex = 0;// current db arr index that is waiting for its turn, to be pushed
// loop through all values and keep pushing in final response unless some DB values comes and get pushed first
for(var key in utilities){
if(dbArrIndex < getUtilityUserPreferences.utilityOrders.length){// if db arr is not finished yet, otherwise we are done with db array
// trying to check if its time for DB values to be pushed, otherwise all of above loop will be pushed
var matching = true;
while(matching && dbArrIndex < getUtilityUserPreferences.utilityOrders.length){// loop can also finish db arr, so validating again
if(getUtilityUserPreferences.utilityOrders[dbArrIndex].order == resPointer){
response[getUtilityUserPreferences.utilityOrders[dbArrIndex].utility] = utilities[getUtilityUserPreferences.utilityOrders[dbArrIndex].utility];resPointer++;
delete utilities[getUtilityUserPreferences.utilityOrders[dbArrIndex].utility];
matching = true;
dbArrIndex++;
}
else{
matching = false;
}
}
}
if(utilities[key]){// could be null by upper if
response[key] = utilities[key];resPointer++;
}
}
}
//DONE!!!!!
for(var key in response){
//console.log(key);
}
console.log(response);
return response;
解决方案
推荐阅读
- node.js - 当我在nestjs中将另一个服务注入用户服务时如何修复未知的身份验证策略“jwt”
- arrays - numba jit 无法理解数组的单个元素不是数组
- fipy - 我如何表达像扩散项这样的术语?
- node.js - 如何根据查询值链接 express-validator?
- javascript - 浏览器开发者工具(F12模式)下直接执行Cypress命令如何打印日志
- excel - 删除新工作簿中的空白行
- python - openpyxl:合并单元格的左右边框
- vb.net - 调整窗口大小和窗口窗体
- kubernetes - 具有容器原生负载平衡的 GKE Ingress 未检测到运行状况检查(字段“resource.httpHealthCheck”的值无效)
- angular - 常规变更日志自定义模板 - 如果未指定关闭,则不返回行