JavaScript のソート sort() メソッド (null、未定義、0 の間のソート (混乱) 問題を解決するため)

ソート関数の戻り値は、ソートされた元の配列への参照です。配列はその場でソートされ、コピーは行われないことに注意してください。

ここに画像の説明を挿入
ここに画像の説明を挿入

質問:

配列内のオブジェクトが null 値の場合、並べ替えはどうなりますか? (nullとunknownが存在するため、明らかに年齢でソートされていません)

var arr=[{
    
    "age":24,name:'zs'},{
    
    "age":0,name:'ls'},{
    
    "age":0,name:'gr'}{
    
    "age":null,name:'yo'},{
    
    "age":7,name:'pl'},{
    
    "age":undefined,name:'tt'}{
    
    "age":null,name:'jz'},{
    
    "age":0,name:'mn'},{
    
    "age":undefined,name:'we'}]

//[{"age": 0,"name": "ls"},{"age": 0,"name": "gr"},{"age": null,"name": "yo"},
//{"age": null,"name": "jz"},{"age": 0,"name": "mn"},{"age": 7,"name": "pl"},
//{"age": 24,"name": "zs"},{"age":undefined,"name": "tt"},
//{"age":undefined,"name": "we"}]
console.log(arr.sort(compare("age")));

単純な配列とオブジェクト配列は、次のように動作が異なります。
ここに画像の説明を挿入

解決:

sort メソッドで提供される並べ替え方法では、返された数値が 0 の場合、元の順序が維持されます。返された数値が > 0 の場合、a は b の後に配置されます。返された数値 < 0 の場合、a はb の前に配置されます。

フィールドが未定義の可能性がある場合、それに対処するには特別な判断が必要です。

まずaとbのソートフィールドが未定義かどうかを判断し、元の順序を維持するために0を返します。

次に、a のフィールドは未定義だが、b のソートフィールドが存在するかどうかを判断し、>0 を返し、b の後に a を置きます。

次に、b のソート フィールドが未定義であるが、a のソート フィールドが存在する場合は、<0 を返し、a を b の前に置きます。

最後に、a と b の両方の並べ替えフィールドが存在する場合、a と b の並べ替えフィールドを使用して計算された返された結果の順序を使用して順序が決定されます。

const compare = function (orderType, props) {
    
    
    return function (obj1, obj2) {
    
    
        var val1 = obj1[props];
        var val2 = obj2[props];
        if (val1 == null && val2 == null) {
    
    
            return 0;
        }
        if(val1 == null){
    
    
            return 999;
	    }
	    if(val2 == null){
    
    
	        return -999
	    }
        if (typeof val1 === 'string' && typeof val2 === 'string') {
    
    
            if (val1 < val2) {
    
    
                return -1;
            } else if (val1 > val2) {
    
    
                return 1;
            }
            return 0;
        }
	    return orderType === 'ascend' ? val1 - val2 : val2 - val1;
    } 
}
const orderType = 'descend'; // descend
const rr = prodInfo.sort(compare(orderType, 'num'))
console.log(rr.map(item => item.num))

参考リンク1:https://www.cnblogs.com/gby-web/p/16743564.html
参考リンク2:https://juejin.cn/post/7165121725678665765/


二重ソート (二次ソート):

2 次ソートとは、データを 2 回ソートすることを指します。1 回目は属性によって、2 回目は別の属性によってソートされます。この並べ替え方法は、学生を学年や年齢で並べ替えたり、商品を価格や売上で並べ替えたりするなど、さまざまなシナリオで使用できます。二次ソートを実装する場合、バブル ソート、クイック ソート、マージ ソートなどのさまざまなアルゴリズムを使用できます。特定のシナリオとデータ量に応じて、最適なアルゴリズムを選択する必要があります。


指定した順序で並べ替える

// ## 按指定序列排序
const arr = [
    {
    
     name: 'A', type: 'fly' },
    {
    
     name: 'B', type: 'blur' },
    {
    
     name: 'C', type: 'wipe' },
    {
    
     name: 'D', type: 'cube' },
    {
    
     name: 'B', type: 'zoom' },
    {
    
     name: 'C', type: 'cube' },
    {
    
     name: 'E', type: 'iris' },
    {
    
     name: 'F', type: 'fade' },
    {
    
     name: 'F', type: '' }
];
// 按type的指定顺序排序
const order = ['wipe', 'fly', 'iris', 'flip', 'cube', 'blur', 'fade', 'zoom'];
arr.sort((star, next) => {
    
    
    return order.indexOf(star.type) - order.indexOf(next.type);
});

console.log(arr);

順不同

// ## 随机排序
arr.sort((a, b) => {
    
    
    return Math.random() - 0.5
}) 
console.log(arr);

おすすめ

転載: blog.csdn.net/yexudengzhidao/article/details/131328091