筛选数组以获取多个值并限制结果

时间:2019-07-18 10:27:58

标签: arrays typescript

我有一个包含多个对象的数组:

export class Task {
  id: number;
  title: string;
  state: number;
  priority: number;
  desc: string;
  date: string;
  listid: string;
}

如何为即将到来的最接近日期的前五个任务过滤该数组?此外,对象的日期可能为空-如果至少没有五个有日期的任务,剩余的任务数量应替换为按优先级排序(5高-1低)的任务。

F.e。对于以下数组(我忽略了次要的值)..

tasks = [
  { date: 19-07-2019, priority: 2 },
  { date: 21-07-2019, priority: 3 },
  { date: 20-07-2019, priority: 4 },
  { date: null, priority: 2 },
  { date: null, priority: 4 },
  { date: null, priority: 5 },
  { date: null, priority: 3 }
  ];

..我希望函数返回此值:

result = [
  { date: 19-07-2019, priority: 2 },
  { date: 20-07-2019, priority: 4 },
  { date: 21-07-2019, priority: 3 },
  { date: null, priority: 5 },
  { date: null, priority: 4 },
];

我已经尝试了出路,但这就是我所拥有的:

getFirstFiveTasks(): Observable<Task[]> {
    return of(this.tasks.filter(tasks => tasks.date > this.date));
}

但是这个仅返回具有即将到来日期的任务,而不是将结果限制为5,并且在存在没有日期的任务时会忽略优先级。

1 个答案:

答案 0 :(得分:1)

在这种情况下,您可以做一些事情。我用JavaScript创建了一个代码段,因此将其转换为打字稿应该不会有太大的麻烦。

在所有这些操作之前,我确实必须更新您的Date字符串,因为我最初无法使用Date.parse来解析它们,但是,我假设您在代码中将日期作为真实日期这样您在使用时就可以忽略我的解析。

因此,要订购1个以上的条件,您可以像这样订购:

function compareTasks( t1, t2 ) {
  // if dates are equal, priority wins
  if (t1.date === t2.date) {
    return t2.priority - t1.priority;
  }
  // if either is null, the other one wins
  if (t1.date === null && t2.date !== null) {
    return 1;
  }
  if (t1.date !== null && t2.date === null) {
    return -1;
  }
  // otherwise, the closest date wins
  return Date.parse(t1.date) - Date.parse(t2.date);
}

一旦有了,就可以对数组进行排序(先对它的一部分进行切片,这样就不会对其进行突变),然后对前n项进行排序。

function orderBy( array, ordercb ) {
  // slice() creates a copy, then sorts on that copy, returning the ordered copy
  // there is no mutation of the input parameter
  return array.slice().sort( ordercb );
}

function take( array, count ) {
  // take the first count items
  return array.slice( 0, count );
}

const tasks = [
  { date: '2019-07-19', priority: 2 },
  { date: '2019-07-21', priority: 3 },
  { date: '2019-07-20', priority: 4 },
  { date: null, priority: 2 },
  { date: null, priority: 4 },
  { date: null, priority: 5 },
  { date: null, priority: 3 }
];

function orderBy( array, ordercb ) {
  return array.slice().sort( ordercb );
}

function take( array, count ) {
  return array.slice( 0, count );
}

function compareTasks( t1, t2 ) {
  if (t1.date === t2.date) {
    return t2.priority - t1.priority;
  }
  if (t1.date === null && t2.date !== null) {
    return 1;
  }
  if (t1.date !== null && t2.date === null) {
    return -1;
  }
  return Date.parse(t1.date) - Date.parse(t2.date);
}

console.log( take( orderBy( tasks, compareTasks ), 5 ) );