为了账号安全,请及时绑定邮箱和手机立即绑定

减少多个字段排序的 Javascript 代码

减少多个字段排序的 Javascript 代码

万千封印 2023-09-28 17:25:27
我有一个数组,其中的数据与此类似,但有更多字段可供排序:const shirts= [    {      type: "T-shirt",      size: "L",      color: "Black",    },    {      type: "Dress Shirt",      size: "S",      color: "Brown",    },    {      type: "Sweatshirt",      size: "M",      color: "Red",    },     {      type: "Polo",      size: "XS",      color: "Pink",    },      ...]我有一个排序功能,根据选择的内容以不同的方式工作,例如,如果用户按尺寸排序,则需要从 XS 到 XL,但任何其他选项都需要按字母顺序排序。这就是我所拥有的://sort is the option the user decided to sort bySortedShirts(sort,shirts){        var newShirtArray=[];        var size1=0;        var size2=0;        if(sort === "type"){            newShirtArray= shirts.sort(function(shirt1,shirt2){                if (shirt1.type> shirt2.type){                     return 1;                }                else{                    return -1;                }             });        }        else if(sort === "color"){            newShirtArray = shirts.sort(function(shirt1,shirt2){                if (shirt1.color > shirt2.color){                     return 1;                }                else{                    return -1;                }             });        }        else if(sort === "size"){            newShirtArray = shirts.sort(function(shirt1,shirt2){                if(shirt1.size==="XS"){                    size1=0;                }                else if(shirt1.size==="S"){                    size1=1;                }                else if(shirt1.size==="M"){                    size1=2;                }                else if(shirt1.size==="L"){                    size1=3;                }                else if(shirt1.size==="XL"){                    size1=4;                }                if(shirt2.size==="XS"){                    size2=0;                }这对我来说似乎是重复的,因为类型和颜色以相同的方式排序,只是在不同的字段中,我觉得我可以将其放入一种排序中,但我不确定如何做到这一点。我想知道是否有这样的事情或者减少我的代码的另一种方法?
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

您可以使用一个switch声明:

switch (sort) {

    case 'color':

    case 'type':

        newShirtArray = shirts.sort(/* ... */);

        break;


    case 'size':

        newShirtArray = shirts.sort(/* ... */);

        break;

}

要将衬衫尺寸转换为数字,您可以使用一个对象:

const ShirtSizes = {

    XS: 0, S: 1, M: 2, L: 3, XL: 4,

};

const shirt1Size = ShirtSizes[shirt1.size];

如果您的环境允许,请使用更简洁的 ES2015 箭头函数:

case 'size':

    newShirtArray = shirts.sort((s1, s2) => ShirtSizes[s1.size] - ShirtSizes[s2.size]);

    break;

对于type和color,正如您所猜测的,您可以使用:

case 'color':

case 'type':

    newShirtArray = shirts.sort((s1, s2) => {

        if (s1[sort] > s2[sort]) {

            return 1;

        } else if (s1[sort] < s2[sort]) {

            return -1;

        } else {

           return 0;

        }

    });

我希望这会有所帮助。


查看完整回答
反对 回复 2023-09-28
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

您可以使用括号访问 JSON 对象的密钥。


const shirts = [

    {

        type: "T-shirt",

        size: "L",

        color: "Black",

    },

    {

        type: "Dress Shirt",

        size: "S",

        color: "Brown",

    },

    {

        type: "Sweatshirt",

        size: "M",

        color: "Red",

    },

    {

        type: "Polo",

        size: "XS",

        color: "Pink",

    },

]


function SortedShirts(sort, shirts) {

    var newShirtArray = [];

    var size1 = 0;

    var size2 = 0;

    if (sort === "type" || sort === "color") {

        newShirtArray = shirts.sort(function (shirt1, shirt2) {

            if (shirt1[sort] > shirt2[sort]) {

                return 1;

            }

            else {

                return -1;

            }

        });

    }

    else if (sort === "size") {

        const sizes = ['XS', 'S', 'M', 'L', 'XL']

        newShirtArray = shirts.sort(function (shirt1, shirt2) {

            const size1 = sizes.indexOf(shirt1.size)

            const size2 = sizes.indexOf(shirt2.size)


            if (size1 > size2) {

                return 1;

            }

            else {

                return -1;

            }

        });

    }

}


查看完整回答
反对 回复 2023-09-28
  • 2 回答
  • 0 关注
  • 96 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信