多字段排序的Javascript代码缩减

多字段排序的Javascript代码缩减,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个数组,其数据与此类似,但有更多字段可供排序: const shirts= [ { type: "T-shirt", size: "L", color: "Black", }, { type: "Dress Shirt", size: "S", color: "Brown",

我有一个数组,其数据与此类似,但有更多字段可供排序:

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 by
SortedShirts(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;
                }
                else if(shirt2.size==="S"){
                    size2=1;
                }
                else if(shirt2.size==="M"){
                    size2=2;
                }
                else if(shirt2.size==="L"){
                    size2=3;
                }
                else if(shirt2.size==="XL"){
                    size2=4;
                }


                if (size1 > size2){ 
                    return 1;
                }
                else{
                    return -1;
                } 
            });
        }
这对我来说似乎是重复的,因为类型和颜色排序方式相同,只是有一个不同的字段,我觉得我可以把它放在一个排序中,但我不确定如何做。我想知道是否有这样的事情

if(sort === "type" || sort === "color"){
     newShirtArray= shirts.sort(function(shirt1,shirt2){
           if (shirt1.fieldOf(sort) > shirt2.fieldOf(sort)){ 
               return 1;
           }
           else{
               return -1;
           } 
     });
}

还是另一种减少代码的方法?

您可以使用括号访问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;
            }
        });
    }
}

您可以使用括号访问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;
            }
        });
    }
}
  • 您可以使用
    开关
    语句:
  • 开关(排序){
    案例“颜色”:
    案例“类型”:
    newshirtaray=shirts.sort(/*…*/);
    打破
    案例“大小”:
    newshirtaray=shirts.sort(/*…*/);
    打破
    }
    
  • 要将衬衫尺寸转换为数字,可以使用以下对象:
  • const衬衫尺寸={
    XS:0,S:1,M:2,L:3,XL:4,
    };
    const shirt1Size=shirtsize[shirt1.size];
    
  • 如果您的环境允许,请使用更简洁的ES2015箭头功能:
  • 案例“大小”:
    newshirtaray=shirts.sort((s1,s2)=>ShirtSizes[s1.size]-ShirtSizes[s2.size]);
    打破
    
  • 对于
    类型
    颜色
    ,正如您所猜测的,您可以使用:
  • case'color':
    案例“类型”:
    newShirtArray=shirts.sort((s1,s2)=>{
    如果(s1[排序]>s2[排序]){
    返回1;
    }else if(s1[排序]
    我希望这会有所帮助

  • 您可以使用
    开关
    语句:
  • 开关(排序){
    案例“颜色”:
    案例“类型”:
    newshirtaray=shirts.sort(/*…*/);
    打破
    案例“大小”:
    newshirtaray=shirts.sort(/*…*/);
    打破
    }
    
  • 要将衬衫尺寸转换为数字,可以使用以下对象:
  • const衬衫尺寸={
    XS:0,S:1,M:2,L:3,XL:4,
    };
    const shirt1Size=shirtsize[shirt1.size];
    
  • 如果您的环境允许,请使用更简洁的ES2015箭头功能:
  • 案例“大小”:
    newshirtaray=shirts.sort((s1,s2)=>ShirtSizes[s1.size]-ShirtSizes[s2.size]);
    打破
    
  • 对于
    类型
    颜色
    ,正如您所猜测的,您可以使用:
  • case'color':
    案例“类型”:
    newShirtArray=shirts.sort((s1,s2)=>{
    如果(s1[排序]>s2[排序]){
    返回1;
    }else if(s1[排序]

    我希望这会有所帮助。

    类型和颜色的顺序是什么?只是它们的字典顺序吗?类型和颜色的顺序是什么?只是它们的字典顺序吗?