我有一个包含文档数组的数组,可以帮助我如何使用数组中的多个文档对这些数组进行排序。用户可以选择要搜索的类型。如果他们可以选择'A'按类型'A'关联的值对所有数组项进行排序,对其他类型也是如此。做这个的最好方式是什么。 Lodash解决方案将非常有益。这些值可以是整数/字符串/ guids / datetime字段。
Type始终是一个字符串,无论如何我认为它确实不重要。
[
[{type:A, value:10},{type:B, value:20},{type:C, value:15},{type:D, value:20}],
[{type:A, value:5},{type:B, value:10},{type:C, value:35},{type:D, value:40}],
[{type:A, value:30},{type:B, value:30},{type:C, value:25},{type:D, value:30}],
[{type:A, value:20},{type:B, value:50},{type:C, value:55},{type:D, value:10}]
]
如果按类型'A'排序,则需要输出
[[{type:A, value:5},{type:B, value:10},{type:C, value:35},{type:D, value:40}],
[{type:A, value:10},{type:B, value:20},{type:C, value:15},{type:D, value:20}],
[{type:A, value:20},{type:B, value:50},{type:C, value:55},{type:D, value:10}],
[{type:A, value:30},{type:B, value:30},{type:C, value:25},{type:D, value:30}]]
答案 0 :(得分:2)
在普通的Javascript中,您可以查找给定的类型并按相应的值排序。
function sort(data, type) {
function getValue(array) {
var value = -Number.MAX_VALUE;
array.some(function (o) {
if (o.type === type) {
value = o.value;
return true;
}
});
return value;
}
data.sort(function (a, b) {
var aa = getValue(a),
bb = getValue(b);
return isFinite(aa) && isFinite(bb) ? aa - bb : aa.localeCompare(bb);
});
}
var data = [[{ type: 'A', value: 10 }, { type: 'B', value: 20 }, { type: 'C', value: 15 }, { type: 'D', value: 'b' }], [{ type: 'A', value: 5 }, { type: 'B', value: 10 }, { type: 'C', value: 35 }, { type: 'D', value: 'a' }], [{ type: 'A', value: 30 }, { type: 'B', value: 30 }, { type: 'C', value: 25 }, { type: 'D', value: 'd' }], [{ type: 'A', value: 20 }, { type: 'B', value: 50 }, { type: 'C', value: 55 }, { type: 'D', value: 'c' }]];
sort(data, 'A');
console.log(data);
sort(data, 'D');
console.log(data);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:2)
以下是使用sortBy进行排序的lodash解决方案,find使用特定type
获取相应的值。
var result = _.sortBy(data, function(item) {
return _.find(item, { type: 'A' }).value;
});
var data = [
[{
type: 'A',
value: 10
}, {
type: 'B',
value: 20
}, {
type: 'C',
value: 15
}, {
type: 'D',
value: 20
}],
[{
type: 'A',
value: 5
}, {
type: 'B',
value: 10
}, {
type: 'C',
value: 35
}, {
type: 'D',
value: 40
}],
[{
type: 'A',
value: 30
}, {
type: 'B',
value: 30
}, {
type: 'C',
value: 25
}, {
type: 'D',
value: 30
}],
[{
type: 'A',
value: 20
}, {
type: 'B',
value: 50
}, {
type: 'C',
value: 55
}, {
type: 'D',
value: 10
}]
];
var result = _.sortBy(data, function(item) {
return _.find(item, { type: 'A' }).value;
});
console.log(result);
body > div { min-height: 100%; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
答案 2 :(得分:0)
您可以使用闭包动态创建关系进行排序。
function sortBy(key){
return function(a,b){
return a[key] - b[key];
}
}
var index = {'A':0, 'B': 1, … };
var userPickedType = 'A';
yourarray.sort(sortBy(index[userPickedType]));