作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下对象数组:
var arr = [
{ brand : 'BMW' , year : '2014' },
{ brand : 'Audi' , year : '2018' },
{ brand : 'Benz' , year : '2020' },
{ brand : 'BMW' , year : '2011' },
{ brand : 'Audi' , year : '2015' },
{ brand : 'BMW' , year : '2010' },
{ brand : 'BMW' , year : '2018' }
]
所以我试图首先按品牌对这个数组进行排序(不是按字母顺序而是按一定的重量...所以宝马具有最高的重量 => 奥迪 => 奔驰)然后按年份..所以我得到了一些东西像这样:
var arr = [
{ brand : 'BMW' , year : '2014' },
{ brand : 'BMW' , year : '2011' },
{ brand : 'BMW' , year : '2010' },
{ brand : 'Audi' , year : '2018' },
{ brand : 'Audi' , year : '2018' },
{ brand : 'Audi' , year : '2015' },
{ brand : 'Benz' , year : '2020' }
]
这是我到目前为止尝试过的方法,但看起来我并不真正了解 sort()
的功能:
function sortByBrand (a,b) {
if(a.brand == 'BMW' && b.brand !=='BMW') {
return 2
}else if (a.brand == 'Audi' && b.brand !=='Audi') {
return 1
} else if (a.brand == 'Benz' && b.brand !=='Benz') {
return 0
}
}
function sortByYear (a,b) {
return parseInt(b.year) - parseInt(a.year)
}
arr.sort(sortByBrand)
arr.sort(sortByYear)
我知道这会改变第一种类型,但我真的不知道如何将两种类型合并在一起
最佳答案
您可以使用 localeCompare
检查一个字符串是在另一个字符串之前还是之后,它返回 1、0 或 -1。将每个对象的 .brand
属性与 localeCompare
进行比较,如果结果为 0,则比较年份的差异:
var arr = [
{ brand : 'A' , year : '2014' },
{ brand : 'B' , year : '2018' },
{ brand : 'C' , year : '2020' },
{ brand : 'A' , year : '2011' },
{ brand : 'B' , year : '2015' },
{ brand : 'A' , year : '2010' },
{ brand : 'B' , year : '2018' }
]
arr.sort((a, b) => (
a.brand.localeCompare(b.brand)
|| b.year - a.year
));
console.log(arr);
请记住,.sort
回调只关心返回值是负数、0 还是正数。返回 2 与返回 1 相同(并且,为了排序算法保持一致,如果 a
与 b
相比返回正值,则 b
与 a
相比应返回负值)。
如果 localeCompare
不够复杂,请制作一个接受对象并返回品牌适当权重的函数:
var arr = [
{ brand : 'BMW' , year : '2014' },
{ brand : 'Audi' , year : '2018' },
{ brand : 'Benz' , year : '2020' },
{ brand : 'BMW' , year : '2011' },
{ brand : 'Audi' , year : '2015' },
{ brand : 'BMW' , year : '2010' },
{ brand : 'BMW' , year : '2018' }
];
const weights = {
BMW: 2,
Audi: 1,
Benz: 0
};
const getWeight = ({ brand }) => weights[brand];
arr.sort((a, b) => (
getWeight(b) - getWeight(a)
|| b.year - a.year
));
console.log(arr);
关于javascript - 按 2 个键对对象数组进行排序,其中一个键有权重,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57750722/
我是一名优秀的程序员,十分优秀!