admin管理员组文章数量:1277317
I have the following array:
[{"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"}]
I need to order this array of objects by "cod_modelo" ascending grouped by "cod_nivel". So the result should be:
[{"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"}]
Ok I made this code that orders the array first by cod_nivel and then by 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;
});
The thing is that this code is ordering also by "cod_nivel" so the obtained array would be:
[{"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"}]
Note that BAC2 cod_nivel objects are at the beginning.
What I need is to order first by cod_nivel but in a given order, which is:
- INC1
- INC2
- PRIM1
- PRIM2
- BAC1
- BAC2
I assume I need an array with the fixed order of "cod_nivel" and use it while ordring but I don't know how to use it so I did not include in my approach.
var order_arr = ['INC1', 'INC2', 'PRIM1', 'PRIM2', 'BAC1', 'BAC2']
And after that, order then by cod_modelo (grouped by each cod_nivel).
I hope I have explained myself clearly and someone can help me.
I have the following array:
[{"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"}]
I need to order this array of objects by "cod_modelo" ascending grouped by "cod_nivel". So the result should be:
[{"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"}]
Ok I made this code that orders the array first by cod_nivel and then by 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;
});
The thing is that this code is ordering also by "cod_nivel" so the obtained array would be:
[{"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"}]
Note that BAC2 cod_nivel objects are at the beginning.
What I need is to order first by cod_nivel but in a given order, which is:
- INC1
- INC2
- PRIM1
- PRIM2
- BAC1
- BAC2
I assume I need an array with the fixed order of "cod_nivel" and use it while ordring but I don't know how to use it so I did not include in my approach.
var order_arr = ['INC1', 'INC2', 'PRIM1', 'PRIM2', 'BAC1', 'BAC2']
And after that, order then by cod_modelo (grouped by each cod_nivel).
I hope I have explained myself clearly and someone can help me.
Share Improve this question edited Mar 21, 2017 at 16:38 isherwood 61.1k16 gold badges120 silver badges169 bronze badges asked Apr 13, 2015 at 9:15 EgidiEgidi 1,7769 gold badges45 silver badges70 bronze badges 4- possible duplicate of Javascript sort function. Sort by First then by Second – Liam Commented Apr 13, 2015 at 9:20
-
Put your sorting code in one callback: First pare the
code_nivel
properties and just, if those are the same sort bycod_modelo
. – Sirko Commented Apr 13, 2015 at 9:20 - Did you try underscorejs , it's really easy to do such stuff with Underscore.js – Alaa-GI Commented Apr 13, 2015 at 9:21
- Possible duplicate of Sort array of objects in specific order – Gajus Commented Nov 20, 2015 at 14:40
2 Answers
Reset to default 10You can assign indexes in an associative array, like this
var cod_nivel_order = {
'INC1': 0,
'INC2': 1,
'PRIM1': 2,
'PRIM2': 3,
'BAC1': 4,
'BAC2': 5
};
and then you can sort like this
function pare(a, b) {
if (a === b) {
return 0;
}
return a < b ? -1 : 1;
}
var sortedArray = array.sort(function (a, b) {
// First pare corresponding values of `cod_nivel` from `cod_nivel_order`
var index_result = pare(cod_nivel_order[a.cod_nivel],
cod_nivel_order[b.cod_nivel]);
// If they are equal
if (index_result === 0) {
// Return the result of paring `cod_modelo`s
return pare(a.cod_modelo, b.cod_modelo);
}
return index_result;
});
and now the result will be
[ { 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' } ]
var data = [{
"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"
}, {
"cod_nivel": "BAC2",
"cod_modelo": "B"
}, {
"cod_nivel": "BAC2",
"cod_modelo": "D"
}, {
"cod_nivel": "BAC2",
"cod_modelo": "A"
}];
var sortOrder = ['INC1', 'INC2', 'PRIM1', 'PRIM2', 'BAC1', 'BAC2'];
data.sort(function (a, b) {
// first have a look at cod_nivel
// get the indices of the given sortOrder
// take the difference of the indices
var delta = sortOrder.indexOf(a.cod_nivel) - sortOrder.indexOf(b.cod_nivel);
// test, if the indices are the same
if (delta === 0) {
// the parison should usually return 0,
// but this will here not work. we need
// the parison of the second sort order of cod_modelo.
// take the variables and make a real parison,
// while we expecting strings to be pared
return a.cod_modelo === b.cod_modelo ? 0 : (a.cod_modelo < b.cod_modelo ? -1 : 1);
}
// otherwise return the delta
return delta;
});
as thefortheye mentioned, the former version does not pute very well. so here is the type safe version for number/number or string/string parison.
本文标签: javascriptSorting an array of objects in a specific orderStack Overflow
版权声明:本文标题:javascript - Sorting an array of objects in a specific order - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741232196a2362313.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论