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对象位于开头
我需要的是先按货到付款,但要按给定的顺序,即:
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的排序不能保证在所有环境中都是稳定的。这是留给实现的。