我有以下数组:
[{"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对象位于开头。
我需要的是首先通过cod_nivel订购,但是按照给定的顺序,即:
我假设我需要一个固定顺序为“cod_nivel”的数组并在ordring时使用它但我不知道如何使用它所以我没有包括在我的方法中。
var order_arr = ['INC1', 'INC2', 'PRIM1', 'PRIM2', 'BAC1', 'BAC2']
之后,然后按cod_modelo排序(按每个cod_nivel分组)。
我希望我能清楚地解释自己,有人可以帮助我。
答案 0 :(得分:8)
您可以在关联数组中分配索引,例如
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;
});
现在结果将是
[ { 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' } ]
答案 1 :(得分:1)
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 comparison should usually return 0,
// but this will here not work. we need
// the comparison of the second sort order of cod_modelo.
// take the variables and make a real comparison,
// while we expecting strings to be compared
return a.cod_modelo === b.cod_modelo ? 0 : (a.cod_modelo < b.cod_modelo ? -1 : 1);
}
// otherwise return the delta
return delta;
});
如上所述,前一版本的计算效果不佳。所以这里是数字/数字或字符串/字符串比较的类型安全版本。