【问题标题】:How to sort an array of objects based on a the length of a nested array in javascript如何根据javascript中嵌套数组的长度对对象数组进行排序
【发布时间】:2011-01-19 02:24:33
【问题描述】:

我在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 } ] 
        }
    ]
}

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

例如,在排序之后,上面的对象可能看起来像这样(降序):

{
    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() 方法来完成此操作。有什么建议吗?

提前致谢!

【问题讨论】:

    标签: javascript arrays sorting object


    【解决方案1】:

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

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

    如果提供了 compareFunction,则数组元素根据比较函数的返回值进行排序。如果 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;
    });
    

    【讨论】:

    • 缓存 elements.length 函数的结果是有意义的,因为它会被调用 O(n * log n) 次,即很多次。
    • @Eli 我怎样才能使它降序排列。?
    • @Mrworldwide 在返回语句中切换一个和另一个,就像这样return other.elements.length - one.elements.length;
    【解决方案2】:
    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);
    

    【讨论】:

    • 错了。对于a.elements.length == b.elements.length 的情况,您必须返回 0。
    猜你喜欢
    • 2016-07-01
    • 2012-06-22
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2015-11-10
    • 2017-04-02
    • 1970-01-01
    相关资源
    最近更新 更多