Javascript 根据另一个属性的升序对已排序的对象数组进行排序

Javascript 根据另一个属性的升序对已排序的对象数组进行排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个具有属性TechType和ProductName的对象数组。给定数组已按TechType排序(不一定按字母顺序);现在,在这个排序数组中,必须根据ProductName按升序对其进行进一步排序 var products= [ { "TechType": "ADSL", "ProductName": " Zen ADSL Services", }, { "TechType": "ADSL", "

我有一个具有属性
TechType
ProductName
的对象数组。给定数组已按
TechType
排序(不一定按字母顺序);现在,在这个排序数组中,必须根据
ProductName
按升序对其进行进一步排序

var products= [
    {
        "TechType": "ADSL",
        "ProductName": " Zen ADSL Services",
            }, {
        "TechType": "ADSL",
        "ProductName": "ADSL Services",
            }, {
        "TechType": "T1",
        "ProductName": "T1-Voice",
},{
      "TechType": "T1",
        "ProductName": " Aviate T1-Voice",


 }
];
排序后的数组应为

  var products= [
        {
            "TechType": "ADSL",
            "ProductName": " ADSL Services",
                }, {
            "TechType": "ADSL",
            "ProductName": "Zen ADSL Services",
                }, {
            "TechType": "T1",
            "ProductName": " Aviate T1-Voice",
    },{
          "TechType": "T1",
            "ProductName": " T1-Voice",


     }
    ];

这在某种程度上与稳定排序有关。确保稳定排序的典型方法是添加辅助数据,如果发现项目相同,则应根据这些辅助数据进行排序

我在这里使用了两个映射操作,类似于施瓦茨变换;仅当两项技术类型不匹配时,才使用辅助数据

为了展示正确的行为,我将项目移动了一下,这样技术类型的顺序与问题的顺序相反

var产品=[{
“TechType”:“T1”,
“产品名称”:“T1语音”,
},{
“TechType”:“T1”,
“产品名称”:“Aviate T1语音”,
}, {
“TechType”:“ADSL”,
“产品名称”:“Zen ADSL服务”,
}, {
“TechType”:“ADSL”,
“产品名称”:“ADSL服务”,
}];
函数SortByTableProperty(数组、属性、fn)
{
//装饰
var temp=array.map(函数(项、索引){
返回[项目,索引];
});
温度排序(功能(a、b){
//按辅助数据或回调函数排序
返回a[0][prop]==b[0][prop]?fn(a[0],b[0]):a[1]-b[1];
});
//不装饰
返回温度图(功能(项目){
退货项目[0];
});
}
//实际种类
products=SortByTableProperty(产品,'TechType',函数(a,b){
返回a.ProductName.localeCompare(b.ProductName);
});
log(JSON.stringify(products))可能重复的