javascript - Sort JSON string by attribute in JavaScript
问题描述
I am new to JavaScript and I'm doing some basic exercises. in my code I have a JSON saved in a String. I want to sort it by age attribute, and show the older employee first in my table, by default.
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"} ]}, ]}'
I thought about parsing the JSON employees into an object, in order to use the JS methods to compare its values, but I don't think I have the right answer yet.
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);
}
or...
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);
}
Is there something I'm missing? Thank you.
解决方案
不要混合东西。写一个比较器函数:
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);
推荐阅读
- php - SQLSTATE [42S22]:未找到列:1054“字段列表”中的未知列“提供者”(SQL:插入“oauth_clients”
- linux - Ubuntu 18.04 容易坏掉
- git - 在 master 上签出,对其进行了更改,现在无法签出回分支
- node.js - 我不能在 nodejs 的 Promise 中使用 req.user 吗?
- laravel - 如何使用 LARAVEL 在 mailgun 标头中发送数据?
- ios - 带有 setCustomSpacing 的 UIStackView 用于动态数量的子视图
- sql - MS SQL 返回没有 GROUP BY 子句的单行案例数据集
- python - 路径插入到 sys.path 但导入模块仍然显示错误,我错过了什么?
- java - Selenium TestnNg - AssertAll() 应该放在测试中的哪个位置
- shell - 如何在shell中保留字符串中的数字?