Javascript 按特定顺序对对象数组进行排序

Javascript 按特定顺序对对象数组进行排序,javascript,arrays,json,sorting,Javascript,Arrays,Json,Sorting,我有以下数组: [{"cod_nivel":"INC2","cod_modelo":"D"}, {"cod_nivel":"PRIM1","cod_modelo":"B"}, {"cod_nivel":"INC2","cod_modelo":"B"}, {"cod_nivel":"INC1","cod_modelo":"D"}, {"cod_nivel":"PRIM1","cod_modelo":"D

我有以下数组:

        [{"cod_nivel":"INC2","cod_modelo":"D"},   
        {"cod_nivel":"PRIM1","cod_modelo":"B"},   
        {"cod_nivel":"INC2","cod_modelo":"B"},  
        {"cod_nivel":"INC1","cod_modelo":"D"},
        {"cod_nivel":"PRIM1","cod_modelo":"D"},
        {"cod_nivel":"BAC2","cod_modelo":"B"},    
        {"cod_nivel":"BAC2","cod_modelo":"D"},    
        {"cod_nivel":"BAC2","cod_modelo":"A"}]
我需要按“cod_modelo”升序并按“cod_nivel”分组来排列这个对象数组。因此,结果应该是:

    [{"cod_nivel":"INC1","cod_modelo":"D"},    
    {"cod_nivel":"INC2","cod_modelo":"B"},
    {"cod_nivel":"INC2","cod_modelo":"D"},    
    {"cod_nivel":"PRIM1","cod_modelo":"B"},    
    {"cod_nivel":"PRIM1","cod_modelo":"D"},
    {"cod_nivel":"BAC2","cod_modelo":"A"},    
    {"cod_nivel":"BAC2","cod_modelo":"B"},    
    {"cod_nivel":"BAC2","cod_modelo":"D"}]
好的,我编写了这段代码,先按cod_nivel排序,然后按cod_modelo排序:

var sortedArray = array.sort(function (a, b) {
    return (a["cod_nivel"] > b["cod_nivel"]) ? 1 : -1;
}).sort(function (a, b) {
    if (a["cod_nivel"] == b["cod_nivel"])
        return (a["cod_modelo"] > b["cod_modelo"]) ? 1 : -1;
    else
        return 0;
});
问题是,此代码也是按“cod_nivel”排序的,因此获得的数组将是:

    [{"cod_nivel":"BAC2","cod_modelo":"A"},    
    {"cod_nivel":"BAC2","cod_modelo":"B"},    
    {"cod_nivel":"BAC2","cod_modelo":"D"},
    {"cod_nivel":"INC1","cod_modelo":"D"},    
    {"cod_nivel":"INC2","cod_modelo":"B"},
    {"cod_nivel":"INC2","cod_modelo":"D"},    
    {"cod_nivel":"PRIM1","cod_modelo":"B"},    
    {"cod_nivel":"PRIM1","cod_modelo":"D"}]
请注意,BAC2 cod_nivel对象位于开头

我需要的是先按货到付款,但要按给定的顺序,即:

  • 印加
  • 印加2
  • PRIM1
  • PRIM2
  • BAC1
  • BAC2
  • 我假设我需要一个固定顺序为“cod_nivel”的数组,并在排序时使用它,但我不知道如何使用它,所以我的方法中没有包括它

    var order_arr = ['INC1', 'INC2', 'PRIM1', 'PRIM2', 'BAC1', 'BAC2']
    
    然后,按cod_modelo(按每个cod_nivel分组)订购


    我希望我已经解释清楚了,有人可以帮助我。

    您可以在关联数组中分配索引,如下所示

    var cod_nivel_order = {
        'INC1': 0,
        'INC2': 1,
        'PRIM1': 2,
        'PRIM2': 3,
        'BAC1': 4,
        'BAC2': 5
    };
    
    function compare(a, b) {
        if (a === b) {
            return 0;
        }
        return a < b ? -1 : 1;
    }
    
    var sortedArray = array.sort(function (a, b) {
    
        // First compare corresponding values of `cod_nivel` from `cod_nivel_order`
        var index_result = compare(cod_nivel_order[a.cod_nivel],
            cod_nivel_order[b.cod_nivel]);
    
        // If they are equal
        if (index_result === 0) {
    
            // Return the result of comparing `cod_modelo`s
            return compare(a.cod_modelo, b.cod_modelo);
        }
    
        return index_result;
    });
    
    然后你可以这样分类

    var cod_nivel_order = {
        'INC1': 0,
        'INC2': 1,
        'PRIM1': 2,
        'PRIM2': 3,
        'BAC1': 4,
        'BAC2': 5
    };
    
    function compare(a, b) {
        if (a === b) {
            return 0;
        }
        return a < b ? -1 : 1;
    }
    
    var sortedArray = array.sort(function (a, b) {
    
        // First compare corresponding values of `cod_nivel` from `cod_nivel_order`
        var index_result = compare(cod_nivel_order[a.cod_nivel],
            cod_nivel_order[b.cod_nivel]);
    
        // If they are equal
        if (index_result === 0) {
    
            // Return the result of comparing `cod_modelo`s
            return compare(a.cod_modelo, b.cod_modelo);
        }
    
        return index_result;
    });
    
    var数据=[{
    “cod_nivel”:“INC2”,
    “cod_modelo”:“B”
    }, {
    “cod_nivel”:“INC2”,
    “cod_modelo”:“D”
    }, {
    “cod_nivel”:“INC2”,
    “cod_modelo”:“B”
    }, {
    “cod_nivel”:“PRIM1”,
    “cod_modelo”:“B”
    }, {
    “cod_nivel”:“INC2”,
    “cod_modelo”:“B”
    }, {
    “cod_nivel”:“INC1”,
    “cod_modelo”:“D”
    }, {
    “cod_nivel”:“INC2”,
    “cod_modelo”:“B”
    }, {
    “cod_nivel”:“PRIM2”,
    “cod_modelo”:“D”
    }, {
    “化学需氧量”:“BAC2”,
    “cod_modelo”:“B”
    }, {
    “化学需氧量”:“BAC2”,
    “cod_modelo”:“D”
    }, {
    “化学需氧量”:“BAC2”,
    “cod_modelo”:“A”
    }];
    var sortOrder=['INC1','INC2','PRIM1','PRIM2','BAC1','BAC2'];
    数据排序(函数(a,b){
    //首先看一看cod_nivel
    //获取给定排序器的索引
    //以指数之差为例
    var delta=排序器索引of(a.cod_nivel)-排序器索引of(b.cod_nivel);
    //如果指数相同,则进行测试
    如果(增量===0){
    //比较通常应返回0,
    //但这在这里行不通,我们需要
    //cod_模型二阶排序的比较。
    //拿这些变量做一个真正的比较,
    //而我们期望字符串被比较
    返回a.cod\u modelo===b.cod\u modelo?0:(a.cod\u modelo

    正如前文提到的,前一个版本的计算不太好。这是数字/数字或字符串/字符串比较的类型安全版本。

    在一个回调中放入排序代码的可能重复:首先比较
    code nivel
    属性,如果它们是相同的排序依据
    cod\u modelo
    。您是否尝试过,用下划线做这些事情真的很容易。js可能是的重复,但这并不是按照我需要的顺序来订购cod_modelos,不是吗?1.印加12。印加2 3。普里姆14。PRIM2 5。bac16。BAC2@Egidi这正是重点。您不必对其进行两次排序(首先按
    cod\u modelo
    排序,然后按
    cod\u nivel
    )。它会给你预期的结果。我还解释了比较的规则。请检查。我正在测试它,它没有给出nedeed结果。我可以理解,我不需要对它进行两次排序,但如上所述,我需要在数组中首先是对象“cod_nivel”='INC1',然后是'INC2'对象,然后是'PRIM1'…使用您的代码在数组的开头排序'BAC1'对象,因为它是按cod_nivel升序排序的,BAC1在INC1之前。。。我错了吗?@Egidi我看不出你的分类模式。当您首先根据
    cod\u modelo
    进行排序,然后再根据
    cod\u nivel
    进行排序时,为什么预期结果中
    D
    出现在
    B
    之后?是的,cod\u modelo必须按升序排序(a、B、c、D、e、f、g…),但cod\u nivel必须按特定方式排序(1.INC1 2.INC2.3.PRIM1 4.PRIM2 5.BAC1 6.BAC2)…请注意,这不是上升…这是一个固定的顺序。也许我没有很好地解释我自己…顺便说一句,我非常感谢你的帮助。可以解释一下你在做什么以及为什么。注意:这不会在所有环境中都起作用,因为JavaScript的排序不能保证在所有环境中都是稳定的。这是留给实现的。