Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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 如何减少amap Array.prototype.some()调用?_Javascript_Angular_Typescript_Optimization_Rxjs - Fatal编程技术网

Javascript 如何减少amap Array.prototype.some()调用?

Javascript 如何减少amap Array.prototype.some()调用?,javascript,angular,typescript,optimization,rxjs,Javascript,Angular,Typescript,Optimization,Rxjs,我有一个服务管理从SocketioAPI获取的数据,比如 export class DataService { private data: SomeData[]; // ... getData(): Observable<SomeData[]> { // distinctUntilChanged was used to limit Observable to only emits when data changes // but it does n

我有一个服务管理从SocketioAPI获取的数据,比如

export class DataService {
  private data: SomeData[];

  // ...
  
  getData(): Observable<SomeData[]> {
    // distinctUntilChanged was used to limit Observable to only emits when data changes
    // but it does not seem to change much things...
    return this.data.pipe(distinctUntilChanged());
  }
 
  // ...
}
问题是,每次发出
combinelatetest
中处理的一个可观测值时,我都要调用
Array.prototype.some()
函数。我不想这样


如何优化此代码,使我不经常调用
some

有关
distinctunitrichanged()
运算符的一点需要注意的是,它只影响订阅。因此,源可观测对象和订阅之间的操作符仍然在运行。作为解决办法,您可以手动检查两次排放之间的数据是否发生了变化。试试下面的方法

让oldData:any;
此.banana$=CombineTest([
SomefNotRequestNetworkObject(),
DataService.getData()
]).烟斗(
地图([网络,数据])=>{
如果(!oldData | | oldData!==数据){
oldData=数据;
返回(network&&data.some(_data=>_data.ip===network.ip));
}

return false;//我认为你关于
distinctUntilChanged
不工作的预感是正确的。 默认情况下,此运算符使用相等检查来确定两个值是否相同。 但是,如果要比较的对象不是简单的标量值(如数字或布尔值),则(在大多数情况下)这将无法正常工作

事实证明,作为
distinctUntilChanged
的第一个参数。 这将在“连续”元素上调用,以确定新元素是否与最近的元素不同

此比较器函数的确切定义取决于
SomeData
类/接口的外观,以及
SomeData
居民数组与另一个居民数组相同的含义。 但是,作为一个例子,让我们假设
SomeData
如下所示:

interface SomeData {
  id: string;
  name: string;
  age: number;
}
如果居民拥有相同的
id
,那么
SomeData
居民就是相同的。 此外,假设两个
SomeData
s数组包含完全相同的
SomeData
元素,则它们是相同的。 那么,我们的比较器函数可能如下所示:

function eqSomeDataArrays(sds1: SomeData[], sds2: SomeData[]): boolean {
  // Two arrays of `SomeData` inhabitants are the same if...
         // ...they contain the same number of elements...
  return sds1.length === sds2.length
         // ...which are "element-wise", the same (i.e. have the same `id`)
      && sds1.every((sd1, i) => sd1.id === sds2[i].id)
}
getData(): Observable<SomeData[]> {
  return this.data.pipe(distinctUntilChanged(eqSomeDataArrays));
}
要将其全部结束,您的
getData
方法现在看起来如下所示:

function eqSomeDataArrays(sds1: SomeData[], sds2: SomeData[]): boolean {
  // Two arrays of `SomeData` inhabitants are the same if...
         // ...they contain the same number of elements...
  return sds1.length === sds2.length
         // ...which are "element-wise", the same (i.e. have the same `id`)
      && sds1.every((sd1, i) => sd1.id === sds2[i].id)
}
getData(): Observable<SomeData[]> {
  return this.data.pipe(distinctUntilChanged(eqSomeDataArrays));
}
getData():可观察{
返回这个.data.pipe(distinctUntilChanged(eqSomeDataArrays));
}

在管道中,在映射调用之后,您可以使用shareReplay(1)


如果确实需要每次调用它,
combinelateest
不是正确的运算符或者您希望使用什么?