【问题标题】:Sort array of objects based on priority number根据优先级对对象数组进行排序
【发布时间】:2015-08-19 21:16:54
【问题描述】:

我有一个像这样的 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;
};

}

【问题讨论】:

    标签: arrays json xml sorting object


    【解决方案1】:

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

    一种功能性方法--

    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

    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" };
        });
    }
    

    【讨论】:

    • 谢谢,但是 datas.push({ 如何打印我的数据?
    • datas.push 只是将参数添加到 datas 数组中。该解决方案使用高阶函数来实现相同的结果。你应该能够像对待你的版本一样对待这个函数,除了这个版本的输出将被排序。
    • 但是我得到了一个错误(ReferenceError: objects is not defined) for here return Object.keys(data.files.audio).sort(function(a,b) {
    • 你把 Object 大写了吗?
    • 我添加了一个不使用 Object.keys 的旧版浏览器兼容替代方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    相关资源
    最近更新 更多