Javascript 按值排序对象未按预期工作
我正在尝试根据value.first\u name对2个对象进行排序。按字母顺序升序的一种。另一个按字母降序排列。然而,它们都在下降。我做错了什么?目标是根据first_name的值排列此数组中的对象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
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)
就可以了-您在这里并不特别需要深度拷贝)