Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在可观测数据上对数据数组进行排序?_Javascript_Angular_Typescript - Fatal编程技术网

Javascript 如何在可观测数据上对数据数组进行排序?

Javascript 如何在可观测数据上对数据数组进行排序?,javascript,angular,typescript,Javascript,Angular,Typescript,使用angular,我从API中提取数据。如果有人能给我启示,我不确定两件事: 1-我应该在可观察对象或订阅服务器上对数组进行排序,为什么 2-我不确定如何使用sort()函数根据值为真或假对数据数组进行排序 下面是我的对象的外观,如果hostname之后的任何值返回false,或者updateDate上的日期超过4周,我需要首先显示该对象。如果一切都是真的,但是日期>2周,而且

使用angular,我从API中提取数据。如果有人能给我启示,我不确定两件事:

1-我应该在可观察对象或订阅服务器上对数组进行排序,为什么

2-我不确定如何使用sort()函数根据值为真或假对数据数组进行排序

下面是我的对象的外观,如果hostname之后的任何值返回false,或者updateDate上的日期超过4周,我需要首先显示该对象。如果一切都是真的,但是日期>2周,而且<4周,我需要它排在第二位。如果对象是完全真实的,并且日期不到两周,我希望它最后一个。将有大约500个这样的Ipcidata物体通过

export interface Ipcidata {
    id: Int16Array;
    hostname: string;
    AMStatus: boolean;
    BLStatus: boolean;
    FirewallRullStatus: boolean;
    FirewallContentStatus: boolean;
    SCCMStatus: boolean;
    MSBaselineStatus: boolean;
    UpdatedDate: Date;
    USBStatus: boolean;
}
这是我的observable,有一个排序函数

  getPciInfo(): Observable <Ipcidata[]> {
    return this.httpClient.get<Ipcidata[]>('http://localhost:499/api/PCImachines').pipe(
      map(results => results.sort()
      )
    );
  }
Array.prototype.sort()
compareFunction
作为参数

i、 e.
result.sort(排序对象)

compareFunction
背后的逻辑是它应该采用两个参数,
firstElement
secondElement
,比如
a
b

那么compareFunction应该是这样的

function compare(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

-JavaScript文档

1-我应该在可观察对象或订阅服务器上对数组进行排序,为什么?

一般来说,我会尽快分类。当您的数据集用于应用程序中未排序的其他位置时,可以在订阅中进行排序。否则我认为用管道分类更好。这也适用于避免订阅和使用异步管道的一般方法

2-我不确定如何使用sort()函数根据值的真假对数据数组进行排序。


见毗湿奴德夫的回答

毗湿奴德夫的回答正是我所需要的。最后,我在observable上进行了排序,这根本不影响页面加载所需的时间。

另外,您可以删除所有
==true
。任何真实的东西都能满足条件。@Jeremythill谢谢。当我修复这个问题时,我很快就做了。出于好奇,如果我只是检查真值或假值,为什么我需要一个“b”参数?我可以省略它,只使用“if a.property=false返回1”吗?Return似乎还改变了实际值,而不仅仅是决定首先显示哪个ICIData对象。不知道为什么会这样。基本上,我不想更改每个对象上的任何属性,但只要根据属性决定在显示数据时哪个对象首先出现。您想排序还是筛选?如果你想排序,那么你需要比较两件事,然后决定把哪一件放在哪里。我想先决定哪个IPCIData对象显示在数组中,而不是真正重新排列对象中的任何属性。对象内部的属性只是决定它们是否是最先出现的属性之一。所以我很确定我仍然想使用Sort,对吗?上面的方法不会重新排列属性,你也不能。这只是根据一些条件对IPCIData对象数组进行排序。有趣的是,当我在if语句后返回1时,它实际上会将该属性的值从0更新为1。我不想更改实际属性。我假设(从我读到的内容来看,-1、1和0意味着对对象进行排序。为什么它会改变这些值?
results.sort(function(a,b) { 
        if (b.AMStatus == true
          && b.BLStatus == true
          && b.FirewallRullStatus == true
          && b.FirewallContentStatus == true
          && b.SCCMStatus == true
          && b.MSBaselineStatus == true
          && b.USBStatus == true
          ){
        return -1;
        }
    })));
  }
function compare(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}