根据优先级编号对对象数组进行排序

时间:2015-08-19 21:16:55

标签: arrays json xml sorting object

我有一个json文件,如:

"files": {
    "audio": {
        "number1": {
            "enabled": false,
            "priority": 5,
        },
        "number1": {
            "enabled": false,
            "priority": 1,
        },
        "number3": {
            "enabled": false,
            "priority": 2,
        }
    }
}


var audioMap = {
    'number1' : {‘name’:’Num1'},
    'number1' : {'name’:'Num2'},
    'number3' : {‘name’:'Num3'},
};

我将这个json文件转换为带有一些函数的xml以及这个函数:

 function extractFile(data){

    var datas = [];
    var element = data.files.audio;


 for (number in audioFiles) {
        var audioName = audioMap[number].name;
        datas.push({
            name : audioName,
            value : audioFiles[number]. enabled ? "true" : "false",
        });
}

    return datas;
}

输出结果为:

   <file name="Num1" enabled="false"/>
   <file name="Num2" enabled="false"/>
   <file name="Num3" enabled="false”/>

如何根据json中的优先级编号对它们进行排序?

输出必须如下:

   <file name="Num2" enabled="false"/>
   <file name="Num3" enabled="false"/>
   <file name="Num1" enabled="false”/>

我不知道在哪里添加排序并使用“优先级”进行排序

例如,如果我想使用此函数或任何排序函数:

function sortBy(key, reverse) {

var moveSmaller = reverse ? 1 : -1;

var moveLarger = reverse ? -1 : 1;

return function(a, b) {
if (a[key] < b[key]) {
  return moveSmaller;
}
if (a[key] > b[key]) {
  return moveLarger;
}
return 0;
};

}

1 个答案:

答案 0 :(得分:2)

我建议获取密钥数组,对其进行排序,然后将其映射到输出结构。内置的排序功能就足够了,你只需要提供比较功能。

功能性方法 -

function extractFile(data) {
    return Object.keys(data.files.audio).sort(function(a,b) {
        return data.files.audio[a].priority - data.files.audio[b].priority;
    }).map(function(key) {
        return { name: audioMap[key].name,
                 value: data.files.audio[key].enabled ? "true" : "false" };
    });
}

如果你需要它在IE中工作&lt; 9您可以执行以下操作:

function extractFile(data) {
    var keys = [];
    for (key in data.files.audio) {
        keys.push(key);
    }
    return keys.sort(function(a,b) {
        return data.files.audio[a].priority - data.files.audio[b].priority;
    }).map(function(key) {
        return { name: audioMap[key].name,
                 value: data.files.audio[key].enabled ? "true" : "false" };
    });
}