在 JavaScript 中按属性对 JSON 字符串进行排序
Posted
技术标签:
【中文标题】在 JavaScript 中按属性对 JSON 字符串进行排序【英文标题】:Sort JSON string by attribute in JavaScript 【发布时间】:2021-12-12 11:57:31 【问题描述】:我是 javascript 新手,我正在做一些基本的练习。在我的代码中,我有一个保存在字符串中的 JSON。我想按年龄属性对其进行排序,默认情况下,在我的表中首先显示年长的员工。
var employees = '"employees":[ "name":"Lucas","surname":"White", "email":"email@gmail.com", "age":31, "work":"Company":"userCompany", "role":"userRole", "car":[ "brand":"userCar", "model":"userCar", "year":"userCar", "bollo":"userCar", ],
"name":"Mary","surname":"userSurname", "email":"email@gmail.com", "age":29, "work":"Company":"userCompany", "role":"userRole", "car":[ "brand":"userCar", "model":"userCar", "year":"userCar", "bollo":"userCar" ], ]'
我想过将 JSON 员工解析成一个对象,以便使用 JS 方法来比较它的值,但我认为我还没有正确的答案。
function compare(a,b)
const obj = JSON.parse(employees);
if ( a.age < b.age )
return -1;
else if ( a.age > b.age )
return 1;
else
return 0;
var compared = obj.compare();
console.log(compared);
或者...
function sortByAge(a,b)
const obj = JSON.parse(employees);
for(var i = 0; i < obj.employees.length; i++)
return parseInt (a.age) - parseInt (b.age);
var sortedByAge = obj.sortByAge();
console.log(sortedByAge);
我有什么遗漏吗?谢谢。
【问题讨论】:
如果你在循环中执行return
,循环将在第一次迭代时退出!
你不需要parseInt
,你数据中的年龄值已经是数字了。
这能回答你的问题吗? Sorting an array of objects by property values
【参考方案1】:
不要混用。写一个比较器函数:
function byAge(a,b)
if (a.age < b.age) return -1;
else if (a.age > b.age) return 1;
else return 0;
解析 JSON
const obj = JSON.parse(employees);
排序
obj.employees.sort(byAge);
console.log(obj);
奖励:通用比较器
function by(property)
return function (a, b)
if (a[property] < b[property]) return -1;
else if (a[property] > b[property]) return 1;
else return 0;
;
const obj = JSON.parse(employees);
obj.employees.sort(by('age'));
console.log(obj);
Bonus #2 按数值排序的简写:
function byAge(a, b)
return a.age - b.age;
之所以有效,是因为计算自然会得出小于 0、大于 0 或恰好为零的值,就像 if
/else if
/else
一样。
// even shorter as am arrow function
obj.employees.sort((a, b) => a.age - b.age);
【讨论】:
以上是关于在 JavaScript 中按属性对 JSON 字符串进行排序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Javascript/AngularJS 中按 Json 对象分组