基于嵌套值或提升值深度排序多维数组

时间:2013-12-03 22:05:22

标签: javascript arrays sorting multidimensional-array

所以我只是在其中一个“这将是绝对的工作”的兴奋时刻,只是伴随着严重的失望。我一直想弄清楚如何对包含数组的数组进行排序,现在我想看看是否想要帮助我:)

数据结构:

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/

2 个答案:

答案 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;
}