按值排序对象不按预期工作

时间:2017-04-26 18:00:00

标签: javascript arrays sorting

我试图根据value.first_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;
});

2 个答案:

答案 0 :(得分:3)

所有三个变量az_partza_partparticipants都指向内存中完全相同的数组。您正在使用升序排序转换该数组,然后立即使用降序排序对其进行重新排序。

使用slice创建数组的浅表副本:

var az_part = participants.slice();
var za_part = participants.slice();

(通过“浅拷贝”我的意思是这将创建一个新的列表,但它不会创建新的对象。每个结果列表将是不同的 - 并且可以进行不同的排序 - 但是如果你改变任何对象在内部,例如,participants[2].notes = "foo",它将改变每个列表中存在的对象。)

答案 1 :(得分:0)

JavaScript对象(包括数组)是对象的引用。所以你要对原始数组进行两次排序。

请查看此问题,以便对问题进行详细说明。

Why does changing an Array in JavaScript affect copies of the array?