【问题标题】:How to conditionally sort and right shift a JSON array?如何有条件地对 JSON 数组进行排序和右移?
【发布时间】:2021-11-15 17:15:03
【问题描述】:

我有一个 JSON 数组如下:

[{
    "name": "ABC",
    "default": false,
    "details": [
        {
            "detail1": "value1"
        },
        {
            "detail2": "value2"
        }
    ]
},
{
    "name": "PQR",
    "default": false,
    "details": [
        {
            "detail3": "value3"
        },
        {
            "detail4": "value4"
        }
    ]
},
{
    "name": "XYZ",
    "default": true,
    "details": [
        {
            "detail5": "value5"
        },
        {
            "detail6": "value6"
        }
    ]
}]

现在,如果 default 值为 true ,我希望它成为数组的第一个元素,其余元素应根据 name 按字母顺序排序。只有一个元素的defaulttrue,或者所有元素的defaultfalse

排序后的预期 JSON 应该是:

[{
    "name": "XYZ",
    "default": true,
    "details": [
        {
            "detail5": "value5"
        },
        {
            "detail6": "value6"
        }
    ]
},
{
    "name": "ABC",
    "default": false,
    "details": [
        {
            "detail1": "value1"
        },
        {
            "detail2": "value2"
        }
    ]
},
{
    "name": "PQR",
    "default": false,
    "details": [
        {
            "detail3": "value3"
        },
        {
            "detail4": "value4"
        }
    ]
}]

我已尝试使用此代码对 JSON 数组进行排序:

jsonArray.sort( function( a, b ) {
    a = a.name.toLowerCase();
    b = b.name.toLowerCase();    
    return a < b ? -1 : a > b ? 1 : 0;        
});

但我无法弄清楚如何检查 default 值并进行相应排序。如何达到预期效果?

【问题讨论】:

  • return 之前,尝试if (a.default) return -1; if (b.default) return 1; 之类的东西(另请注意,您所拥有的只是一个数组。JSON 是一种用于传输对象的文本格式,但没有像JSON 数组/JSON 对象)
  • 我将首先不重新分配您的输入变量a, b,这样做您将无法访问数组元素的其他属性。

标签: javascript


【解决方案1】:

你是在正确的方式。只需修改函数以包含对default 的检查:

jsonArray.sort( function( a, b ) {
    const name1 = a.name.toLowerCase();
    const name2 = b.name.toLowerCase();    
    return (b.default - a.default) || ((name1 > name2) - (name2 > name1))
});

我从这里得到了字符串比较的快速代码:https://stackoverflow.com/a/17765169/2244262

【讨论】:

    猜你喜欢
    • 2021-03-08
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多