所以我只是在其中一个“这将是绝对的工作”的兴奋时刻,只是伴随着严重的失望。我一直想弄清楚如何对包含数组的数组进行排序,现在我想看看是否想要帮助我:)
数据结构:
var array = [{ name: "sunday", data: [{x: 5, y: 7}, { x: 6, y: 12 }, { x: 6, y: 22 }]},
{ name: "tuesday", data: {x: 1, y: 15}},
{ name: "monday", data: {x: 3, y: 25}},
{ name: "thursday", data: {x: 7, y: 5}},
{ name: "friday", data: {x: 2, y: 2}}];
悲伤片段:
function compare(a,b) {
var c = undefined != a.data.length ? Math.max.apply(Math,a.data.map(function(o){return o.y;})) : a.y;
var d = undefined != b.data.length ? Math.max.apply(Math,b.data.map(function(o){return o.y;})) : b.y;
if (c > d)
return -1;
if (c < d)
return 1;
return 0;
}
所以这个想法很基础,我想根据max y值对数组进行排序。问题是每个数组条目都有可变数量的x / y对...所以我需要根据可能的深(er)嵌套值进行比较。
基本上比较器检查数据是否是数组,如果它是使用一些数学幻象并弹出包含在其中的y的最大值...如果它不是它只是取y值。
有效。我目前在比较器中实现的极其基本的if a > b return -1
模式也是如此。但是惊喜......他们一起讨厌我。任何想法都将不胜感激。
编辑:行动失败 - http://jsfiddle.net/TpF8g/
答案 0 :(得分:2)
因此,您尝试根据名为y
的属性对对象列表进行排序,并且每个对象可能具有可变数量的y
。此外,如果有> 1 y
,您要考虑最大值。
以下是我将如何编写比较函数:
function compare(a, b) {
// Get our maximum y value
var getMaxY = function(data) {
// Check if array
if (data instanceof Array) {
// Sort our inner array
data.sort(function(a, b) {
return a.y - b.y;
});
// Get the last one
return data[data.length - 1].y;
}
// Else return y
return data.y;
}
// Compare the maximum y values
return getMaxY(a.data) - getMaxY(b.data);
}
答案 1 :(得分:1)
您错过了data
财产:
function compare(a,b) {
var c = undefined != a.data.length ? Math.max.apply(Math,a.data.map(function(o){return o.y;})) : a.data.y;
var d = undefined != b.data.length ? Math.max.apply(Math,b.data.map(function(o){return o.y;})) : b.data.y;
if (c > d)
return -1;
if (c < d)
return 1;
return 0;
}
较短的版本可能是:
function compare(a,b) {
function byY(d1, d2){ return d1.y - d2.y; }
// quick and dirty
var c = a.data.length ? a.data.sort(byY)[a.data.length-1].y : a.data.y;
var d = b.data.length ? b.data.sort(byY)[b.data.length-1].y : b.data.y;
return d - c;
}