根据其他对象的array属性对对象数组进行排序的最快方法

时间:2019-09-02 08:26:51

标签: javascript arrays typescript

我有两个对象数组,并且它们都具有columnId属性。 我想使第一个对象的数组的顺序与第二个对象的顺序相同。

我已经尝试过了:

filtered = visibleColumns.filter(function(v) {
            return filtered.includes(v.colId);
        });

其中filtered是我的结果数组,而visibleColumns是我需要的顺序数组,但是它不起作用。

数组示例:

filtered = [{
  colId:1,
  title: 'col1',
  size: 10
},
{
  colId:2,
  title: 'col2',
  size: 10
}];

visibleColumns = [{
  colId:2,
  visible: true
  },
{
  colId:1,
  visible: true
}];

2 个答案:

答案 0 :(得分:1)

您可以创建一个Map对象,该对象将colId中的每个visibleColumns映射到数组中的索引。为colId排序时获取每个filtered的索引

const filtered = [{ colId: 1, title: "col1", size: 10 }, { colId: 2, title: "col2", size: 10 }],
      visibleColumns = [{ colId: 2, visible: true }, { colId: 1, visible: true }];

const order = new Map(visibleColumns.map((o, i) => [o.colId, i]))

filtered.sort((a, b) => order.get(a.colId) - order.get(b.colId))

console.log(filtered)

答案 1 :(得分:1)

您可以创建具有所需顺序的对象,并为未知ID取默认值,以将其排序到底部。

var filtered = [{ colId: 1, title: 'col1', size: 10 }, { colId: 2, title: 'col2', size: 10 }],
    visibleColumns = [{ colId: 2, visible: true }, { colId: 1, visible: true }],
    order = visibleColumns.reduce((o, { colId }, i) => (o[colId] = i + 1, o), {});

filtered.sort((a, b) => (order[a.colId] || Infinity) - (order[b.colId] || Infinity));

console.log(filtered);
.as-console-wrapper { max-height: 100% !important; top: 0; }