Javascript 按值排序对象未按预期工作

Javascript 按值排序对象未按预期工作,javascript,arrays,sorting,Javascript,Arrays,Sorting,我正在尝试根据value.first\u name对2个对象进行排序。按字母顺序升序的一种。另一个按字母降序排列。然而,它们都在下降。我做错了什么?目标是根据first_name的值排列此数组中的对象 var participants = [ { id: "992543", first_name: "", last_name: "", company: null, notes: "", registrationType: "", ale

我正在尝试根据value.first\u name对2个对象进行排序。按字母顺序升序的一种。另一个按字母降序排列。然而,它们都在下降。我做错了什么?目标是根据first_name的值排列此数组中的对象

var participants = [
  {
    id: "992543",
    first_name: "",
    last_name: "",
    company: null,
    notes: "",
    registrationType: "",
    alerts: [ ],
    reg_scan: null
  },
  {
    id: "999070",
    first_name: "Tori",
    last_name: "Fullard",
    company: null,
    notes: "",
    registrationType: "Staff",
    alerts: [ ],
    reg_scan: null
  },
  {
    id: "99265",
    first_name: "Ronald",
    last_name: "Brown",
    company: null,
    notes: "",
    registrationType: "Dean's Guest",
    alerts: [ ],
    reg_scan: null
  },
  {
    id: "992279",
    first_name: "Laila",
    last_name: "Shetty",
    company: null,
    notes: "",
    registrationType: "Table Guest",
    alerts: [
      {
        alert_id: "1",
        dismissed: "0"
      }
    ],
    reg_scan: null
    },
    {
    id: "992248",
    first_name: "Paul",
    last_name: "Keenan",
    company: null,
    notes: "",
    registrationType: "Table Guest",
    alerts: [ ],
    reg_scan: null
    }
    ];

var az_part = participants;
var za_part = participants;
az_part.sort(function(a, b) {
    var nameA = a.first_name.toLowerCase();
    var nameB = b.first_name.toLowerCase();
    if (nameA > nameB) return 1;
    if (nameA < nameB) return -1;
    return 0;
});

za_part.sort(function(a, b) {
    var nameA = a.first_name.toLowerCase();
    var nameB = b.first_name.toLowerCase();
    if (nameA > nameB) return -1;
    if (nameA < nameB) return 1;
    return 0;
});
var参与者=[
{
id:“992543”,
名字:“,
姓氏:“,
公司名称:空,
注:“,
注册类型:“”,
警报:[],
注册表扫描:空
},
{
id:“999070”,
名字:“Tori”,
姓:“富勒德”,
公司名称:空,
注:“,
注册类型:“员工”,
警报:[],
注册表扫描:空
},
{
id:“99265”,
名字:“罗纳德”,
姓:“布朗”,
公司名称:空,
注:“,
注册类型:“院长的客人”,
警报:[],
注册表扫描:空
},
{
id:“992279”,
名字:“莱拉”,
姓:“谢蒂”,
公司名称:空,
注:“,
注册类型:“餐桌客人”,
警报:[
{
警报id:“1”,
驳回:“0”
}
],
注册表扫描:空
},
{
id:“992248”,
名字:“保罗”,
姓:“基南”,
公司名称:空,
注:“,
注册类型:“餐桌客人”,
警报:[],
注册表扫描:空
}
];
var az_部分=参与者;
var za_部分=参与者;
az_部件排序(功能(a、b){
var nameA=a.first_name.toLowerCase();
var nameB=b.first_name.toLowerCase();
如果(nameA>nameB)返回1;
如果(nameAnameB)返回-1;
如果(nameA
所有三个变量
az_部分
za_部分
,和
参与者
都指向内存中完全相同的数组。您正在使用升序排序转换该数组,然后立即使用降序排序对其重新排序

使用
slice
创建阵列的浅拷贝:

var az_part = participants.slice();
var za_part = participants.slice();
(我所说的“浅层复制”是指这将创建一个新列表,但它不会创建新对象。每个结果列表将不同——并且可以进行不同的排序——但是如果您对其中的任何对象进行变异,例如,
参与者[2]。notes=“foo”
,这将更改每个列表中存在的对象。)

JavaScript对象(包括数组)是对对象的引用。因此,您将对原始数组进行两次排序

有关问题的详细描述,请参见此问题


az_部分
zau部分
是同一件事,
参与者
。只有一个数组,所以你要对同一数组进行两次排序。检查
参与者
,你会发现即使你的代码没有显式排序,它也是以同样的方式排序的。你需要复制数组(
participants.slice(0)
就可以了-您在这里并不特别需要深度拷贝)