【问题标题】:How do I sort a JSON array by value that is nested array[].Level1.Level2 [duplicate]如何按嵌套数组 [].Level1.Level2 [重复] 的值对 JSON 数组进行排序
【发布时间】:2019-12-27 14:17:07
【问题描述】:

我需要按嵌套的值对 JSON 数组进行排序。这是我正在使用的例程,它总是返回0。我要排序的字段值为advancedoptions.storeId

orders.sort(GetSortOrder("advancedOptions.storeId"));

function GetSortOrder(prop) {  
    return function(a, b) {  
        if (a[prop] > b[prop]) {  
            return 1;  
        } else if (a[prop] < b[prop]) {  
            return -1;  
        }  
        return 0;  
    }  
}

我想按 storeId 对 JSON 进行排序:

{
    "orders": [
        {
            "orderId": 415354051,
            "advancedOptions": {
                "storeId": 376480
            }
        },
        {
            "orderId": 415172626,
            "advancedOptions": {
                "storeId": 375780
            }
        },
        {
            "orderId": 414286558,
            "advancedOptions": {
                "storeId": 376480
            }
        },
        {
            "orderId": 412403726,
            "advancedOptions": {
                "storeId": 376480
            }
        }
    ]
}

正确的排序顺序应该是:

"orderId": 415172626,
"orderId": 415354051,
"orderId": 414286558,
"orderId": 412403726,

【问题讨论】:

  • 仅供参考,JSON 是一个对象的文本表示(序列化的结果)。您在这里拥有的是一个对象,如果您愿意,也可以是一个 Javascript 对象;没有 JSON 对象。

标签: javascript json sorting


【解决方案1】:

这是您传入的道具,您无法访问对象中的嵌套属性a["advancedOptions.storeId"]。您需要执行类似a["advancedOptions"]["storeId"] 的操作。你的函数总是返回 0 的原因是因为 a["advancedOptions.storeId"] 总是返回 undefined 不满足你的 if 语句。

【讨论】:

    【解决方案2】:

    function GetSortOrder(select) {
      return function(a, b) {
        const propA = select(a);
        const propB = select(b);
        if (propA > propB) {
          return 1;
        } else if (propA < propB) {
          return -1;
        }
        return 0;
      };
    }
    
    const orders = [
      { advancedOptions: { storeId: 34 } },
      { advancedOptions: { storeId: 342 } },
      { advancedOptions: { storeId: 3 } },
    ];
    
    orders.sort(GetSortOrder(function (i) { return i.advancedOptions.storeId }));
    
    console.log(orders);

    【讨论】:

    • 此代码用于支持 ES5 的 google app 脚本。我不能使用箭头函数技术(我不熟悉)在旧的 Function 表达方式中会是什么样子?
    【解决方案3】:

    如前所述,使用方括号符号object[property] 时无法访问嵌套属性。您需要为每一层嵌套应用括号,例如object[property][propery]。当您调用 a[advancedOptions.storeId] 时,它返回未定义,因为使用括号表示法访问 storeId 的正确语法是 a[advancedOptions][storeId]

    如果你只需要按一个属性排序,为什么不使用:

    orders.sort((a, b) =&gt; a.advancedOptions.storeId &gt; b.advancedOptions.storeId)

    【讨论】:

    • 此代码用于支持 ES5 的 google app 脚本。我不能使用箭头函数技术(我不熟悉),这在旧的 Function 表达方式中会是什么样子?
    【解决方案4】:

    试试这个让数据按storeId排序

    ordersData.orders.sort((a,b) => 
          a.advancedOptions.storeId < b.advancedOptions.storeId ? -1 : a.advancedOptions.storeId > b.advancedOptions.storeId ? 1 : 0
        );
    

    var ordersData = {
        "orders": [
            {
                "orderId": 415354051,
                "advancedOptions": {
                    "storeId": 376480
                }
            },
            {
                "orderId": 415172626,
                "advancedOptions": {
                    "storeId": 375780
                }
            },
            {
                "orderId": 414286558,
                "advancedOptions": {
                    "storeId": 376480
                }
            },
            {
                "orderId": 412403726,
                "advancedOptions": {
                    "storeId": 376480
                }
            }
        ]
    }
    ordersData.orders.sort((a,b) => 
      a.advancedOptions.storeId < b.advancedOptions.storeId ? -1 : a.advancedOptions.storeId > b.advancedOptions.storeId ? 1 : 0
    );
    console.log(ordersData);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      相关资源
      最近更新 更多