首页 > 解决方案 > 对对象字面量数组进行排序

问题描述

我有这个对象数组。我正在尝试按给定的顺序或顺序重新排列它们。

例如,如果我说油应该按顺序排列 = 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;

标签: javascriptarrayssortingobject-literal

解决方案


推荐阅读