我有以下数组
let requiredFields = ["Given Name", "Surname", "Sex", "Birth Date", "Birth Place"]
我正在过滤输入数组,以仅返回x.key值等于所需值之一的对象。
let filtered = fields.filter((x) => requiredFields.includes(x.key));
现在如何对已过滤的数组进行排序,使对象按requiredFields数组的顺序排列。
x.key指向在requiredFields中找到的值。
答案 0 :(得分:2)
您可以通过获取requiredFields
元素的索引来添加排序。
let requiredFields = ["Given Name", "Surname", "Sex", "Birth Date", "Birth Place"],
filtered = fields
.filter(({ key }) => requiredFields.includes(key))
.sort(({ key: a }, { key: b }) =>
requiredFields.indexOf(a) - requiredFields.indexOf(b));
答案 1 :(得分:0)
您可以过滤键,然后按照在必填字段中找到的标记对结果进行排序。
let fields = [
"Age", "Birth Date", "Birth Place", "Given Name", "ID", "Sex", "Surname"
].map(field => ({ key: field }));
let filter = [ "Given Name", "Surname", "Sex", "Birth Date", "Birth Place" ];
console.log(filterSort(fields, filter));
function filterSort(data, order) {
return orderArray(data.filter((x) => order.includes(x.key)), order);
}
// Adapted from: https://stackoverflow.com/a/13518848/1762224
function orderArray(data, order) {
return data.reduce((result, item, index) => {
result[order.indexOf(data[index].key)] = data[index];
return result;
}, []);
}
.as-console-wrapper { top: 0; max-height: 100% !important; }
此外,您可以通过按其键将必填字段映射到适当的字段来跳过排序。
let fields = [
"Age", "Birth Date", "Birth Place", "Given Name", "ID", "Sex", "Surname"
].map(field => ({ key: field }));
let filter = [ "Given Name", "Surname", "Sex", "Birth Date", "Birth Place", "Location" ];
console.log(filterSort(fields, filter));
function filterSort(data, order) {
return order.map(o => data.find(x => x.key === o)).filter(x => x != null);
}
.as-console-wrapper { top: 0; max-height: 100% !important; }