如何通过按另一个数组的顺序找到的键对对象数组进行排序

时间:2019-02-21 15:05:41

标签: javascript ecmascript-6

我有以下数组

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中找到的值。

2 个答案:

答案 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; }