javascript - 基于多个条件的 Javascript 数组排序(一次迭代)
问题描述
我有一系列汽车:
enum Condition {
New = 1,
Used = 2
}
type Car = {
make: string;
model: string;
age: number;
condition: Condition;
};
const cars: Car[] = [
{id: "1", make: "BMW", model: "E3", age: 12, condition: Condition.Used},
{id: "2", make: "Audi", model: "A8", age: 4, condition: Condition.Used},
{id: "3", make: "Mercedes", model: "SLK", age: 0, condition: Condition.New},
{id: "4", make: "Ford", model: "CMAX", age: 3, condition: Condition.Used},
{id: "5", make: "Ford", model: "BMAX", age: 0, condition: Condition.New},
{id: "6", make: "Porsche", model: "Panamera", age: 0, condition: Condition.New},
]
我有一个搜索查询:
const searchQuery: Car = {
make: "Ford",
model: "Panamera",
age: 4,
condition: Condition.New
}
我想有一个基于这些规则的排序数组:
- 与品牌(“福特”)完全匹配的物品排在第一位
- 与模型完全匹配的其余部分(“Panamera”)排在第二位
- 其余符合 age = 4 的条件
- 其余的条件是新的,
- 最后是任何未通过任何测试的项目
首先,我所做的是过滤与品牌匹配的数组,然后是模型,然后是年龄等......然后将结果数组合并到最终数组(也过滤掉通过多个条件的重复项),但这需要迭代超过cars
我所拥有的标准数量的多次。所以我想知道是否有更好的方法可以一次性完成?也许以.sort
某种方式使用?
解决方案
您可以创建一个映射函数来确定您的优先级,并在您的排序中减去标准化值。
const Condition = { New: 1, Used: 2 };
const cars = [
{id: "1", make: "BMW", model: "E3", age: 12, condition: Condition.Used},
{id: "2", make: "Audi", model: "A8", age: 4, condition: Condition.Used},
{id: "3", make: "Mercedes", model: "SLK", age: 0, condition: Condition.New},
{id: "4", make: "Ford", model: "CMAX", age: 3, condition: Condition.Used},
{id: "5", make: "Ford", model: "BMAX", age: 0, condition: Condition.New},
{id: "6", make: "Porsche", model: "Panamera", age: 0, condition: Condition.New},
];
const searchQuery = {
make: "Ford",
model: "Panamera",
age: 4,
condition: Condition.New
};
const prioritize = (car, query) => {
if (car.make === query.make) return 4;
if (car.model === query.model) return 3;
if (car.age === query.age) return 2;
if (car.condition === query.condition) return 1;
return 0;
};
const sorted = cars.sort((a, b) => {
const prioA = prioritize(a, searchQuery);
const prioB = prioritize(b, searchQuery);
return prioB - prioA;
});
console.log(JSON.stringify(sorted, null, 2));
如果您希望排序适用于多个条件,例如第一个品牌和型号,您可以添加一个简单的递归检查并增加优先级:
const prioritize = (car, query) => {
const { make, model, age, condition } = query;
if (car.make === make) return 4 + prioritize(car, { model, age, condition });
if (car.model === model) return 3 + prioritize(car, { age, condition });
if (car.age === age) return 2 + prioritize(car, { condition });
if (car.condition === condition) return 1;
return 0;
};
在这里,您只需检查下一行的其他查询选项。
推荐阅读
- ios - 使用 Expo iOS app 测试纯 react 原生代码
- image-uploading - Api 平台上传图片 – 如何解决未知错误?
- c# - Unity - 点光源没有出现
- python - 如何将文件重命名为文件名中的子字符串?
- python-3.x - python3.7 - NameError:名称'paul'未使用定义
- amazon-web-services - 如何解决无法启动服务控制器:警告:未提供云提供商
- c - 尝试使用 c 编程中的结构和函数将单数名词变为复数
- javascript - 试图在给出错误时找到最大的 4 个数字,但我不明白 TypeError: Cannot read property 'length' of undefined with my code
- html - 如何从数组中获取第一个数据?
- python - Python创建在所有类对象之间共享的静态对象