如何根据javascript中嵌套数组的长度对对象数组进行排序

时间:2010-02-20 10:34:07

标签: javascript arrays sorting object

我在javascript中有一个对象数组,每个对象都有一个数组:

{
    category: [ 
        { name: "Cat1", elements : [ 
            { name: name, id: id } ] 
        },
        { name: "Cat2", elements : [ 
            { name: name, id: id },
            { name: name, id: id },
            { name: name, id: id } ] 
        }, 
        { name: "Cat3", elements : [ 
            { name: name, id: id },
            { name: name, id: id } ] 
        }
    ]
}

我想根据嵌套数组“elements”中的对象数量对数组“类别”进行排序。

例如,排序后,上面的对象可能如下(降序):

{
    category: [ 
        { name: "Cat2", elements : [ 
            { name: name, id: id },
            { name: name, id: id },
            { name: name, id: id } ] 
        }, 
        { name: "Cat3", elements : [ 
            { name: name, id: id },
            { name: name, id: id } ] 
        },
        { name: "Cat1", elements : [ 
            { name: name, id: id } ] 
        }

    ]
}

我想知道是否可以使用javascript的sort()方法完成此操作。有什么建议吗?

提前致谢!

2 个答案:

答案 0 :(得分:15)

sort方法接受一个函数,您可以在其中定义如何比较两个元素。这是relevant documentation

  

compareFunction 指定一个   定义排序顺序的函数。   如果省略,则对数组进行排序   按字典顺序(在字典中   顺序)根据字符串   转换每个元素。

如果提供compareFunction,则根据compare函数的返回值对数组元素进行排序。如果a和b是要比较的两个元素,那么:

  • 如果compareFunction(a,b)小于0,则将a排序为低于b的索引。

  • 如果compareFunction(a,b)返回0,则保持a和b相对于彼此不变,但是对所有不同的元素进行排序。注意:ECMAscript标准不保证这种行为,因此并非所有浏览器(例如可追溯到至少2003年的Mozilla版本)都尊重这一点。

  • 如果compareFunction(a,b)大于0,则将b排序为低于a的索引。

示例代码

var sorted_categories = original.category.sort(function (one, other) {
   //a - b is 
   //   0 when elements are the same
   //  >0 when a > b
   //  <0 when a < b
   return one.elements.length - other.elements.length;
});

答案 1 :(得分:-1)

var category = [ 
        { name: "Cat1", elements : [ 
            { name: name, id: id } ] 
        },
        { name: "Cat2", elements : [ 
            { name: name, id: id },
            { name: name, id: id },
            { name: name, id: id } ] 
        }, 
        { name: "Cat3", elements : [ 
            { name: name, id: id },
            { name: name, id: id } ] 
        }
];

function myAbcSort(a, b){
    if(a.elements.length > b.elements.length) {
        return -1;
    } else {
        return 1;
    }
}
category.sort(myAbcSort);