考虑到我有这个

type DataTableType = {
  name: string;
  series: {
    name: string;
    value: number;
  }[];
}[];

let datatable: DataTableType = [
    {
      name: 'Row 1',
      series: [
        {
          name:'Series 1',
          value:7110
        },
        {
          name:'Series 2',
          value:8240
        },
        {
          name:'Series 3',
          value:2111
        },
        {
          name:'Series 4',
          value:3120
        }
      ]
    },
    {
      name: 'Row 2',
      series: [
        {
          name:'Series 1',
          value:6500
        },
        {
          name:'Series 2',
          value:9120
        },
        {
          name:'Series 3',
          value:5123
        },
        {
          name:'Series 4',
          value:8200
        }
      ]
    },
    {
      name: 'Row 3',
      series: [
        {
          name:'Series 1',
          value:-6453
        },
        {
          name:'Series 2',
          value:-9000
        },
        {
          name:'Series 3',
          value:5009
        },
        {
          name:'Series 4',
          value:8900
        }
      ]
    },
    {
      name: 'Row 4',
      series: [
        {
          name:'Series 1',
          value:8567
        },
        {
          name:'Series 2',
          value:4332
        },
        {
          name:'Series 3',
          value:-3111
        },
        {
          name:'Series 4',
          value:-3222
        }
      ]
    },
    {
      name: 'Row 5',
      series: [
        {
          name:'Series 1',
          value:8333
        },
        {
          name:'Series 2',
          value:3234
        },
        {
          name:'Series 3',
          value:-7323
        },
        {
          name:'Series 4',
          value:1544
        }
      ]
    },
    {
      name: 'Row 6',
      series: [
        {
          name:'Series 1',
          value:2112
        },
        {
          name:'Series 2',
          value:3232
        },
        {
          name:'Series 3',
          value:-8231
        },
        {
          name:'Series 4',
          value:1111
        }
      ]
    },
    {
      name: 'Row 7',
      series: [
        {
          name:'Series 1',
          value:-2112
        },
        {
          name:'Series 2',
          value:3232
        },
        {
          name:'Series 3',
          value:8231
        },
        {
          name:'Series 4',
          value:-9111
        }
      ]
    },
    {
      name: 'Row 8',
      series: [
        {
          name:'Series 1',
          value:-2112
        },
        {
          name:'Series 2',
          value:100
        },
        {
          name:'Series 3',
          value:-3
        },
        {
          name:'Series 4',
          value:0
        }
      ]
    }
  ]

我想使用RxJS从数据表中找到最大值和最小值,我已经完成了下面的操作以找到最大值和最小值

function findMax(column: DataTableType) {
  let maxN = column[0].series[0].value;
  of(...column)
    .pipe(
      mergeMap(
        (item: DataTableType[number], i: number) => from(
          [...item.series]
        )
        .pipe(
          max((a, b) => a.value < b.value? b.value : a.value)
        )
      )
    )
    .subscribe(
      (category: { value: number; }) => {
        maxN = category.value;
      }
    )
  ;
  return maxN;
}

function findMin(column: DataTableType) {
  let minN = column[0].series[0].value;
  of(...column)
    .pipe(
      mergeMap(
        (item: DataTableType[number], i: number) => from(
          [...item.series]
        )
        .pipe(
          min((a, b) => a.value > b.value? b.value : a.value)
        )
      )
    )
    .subscribe(
      (category: { value: number; }) => {
        minN = category.value;
      }
    )
  ;
  return minN;
}

但是每当我运行函数findMax(DataTable)和findMin(DataTable)时,我得到对象数组的最后一个元素(即第8行)的max=0和min=-2112.

我的预期答案应该是max=9120和min=-9111

求求你我需要帮助.

推荐答案

指定给min和max的函数的行为应该类似于传递给Array.sort()的比较器函数:

返回值应该是一个数字,其符号指示两个元素的相对顺序:如果a小于b,则为负数;如果a大于b,则为正数;如果a大于b,则为零.

遗憾的是,RxJS的文档仅通过示例提供了这一点,即对于min(),它给出了示例:

min((a, b) => a.age < b.age ? -1 : 1)

请注意,minmax使用相同的比较,您不必根据您想要的最小或最大来调整它.因此,在您的情况下,两者都是(a,b) => a.value - b.value英镑.


您的函数中的第二个问题是,您将min/max应用于您在mergeMap()内生成的蒸汽,因此它将针对每组进行判断,而不是平坦化的流.因此,您将为每Row个项目获得一个结果,并且您的变量将被设置 for each 项目,直到它与上次迭代的值一起返回.

相反,在合并之后应用min/max,以便从整个流中获得最小/最大值.

与固定比较器一起,这为您提供了:

function findMax(column) {
  let maxN = column[0].series[0].value;
  from(column)
    .pipe(mergeMap(item => item.series))
    .pipe(max((a, b) => a.value - b.value))
    .subscribe(
      (category) => {
        maxN = category.value;
      }
    )
  ;
  return maxN;
}

或者,您也可以让mergeMap直接提取值,这样您就不必使用比较器:

function findMax(column) {
  let maxN = column[0].series[0].value;
  from(column)
    .pipe(mergeMap(item => from(item.series).pipe(map(s => s.value))))
    .pipe(max())
    .subscribe(
      (category) => {
        maxN = category;
      }
    )
  ;
  return maxN;
}

Javascript相关问答推荐

在JavaScript中,是否有一种方法可以创建自定义thable,在等待某些代码后自动触发它?

为什么JavaScript双边字符串文字插值不是二次的?

如何通过onClick为一组按钮分配功能;

JS、C++和C#给出不同的Base 64 Guid编码结果

我不知道为什么setwritten包装promise 不能像我预期的那样工作

在带有背景图像和圆形的div中添加长方体阴影时的重影线

如何控制Reaction路由加载器中的错误状态?

Web Crypto API解密失败,RSA-OAEP

从Nextjs中的 Select 项收集值,但当单击以处理时,未发生任何情况

覆盖加载器页面避免对页面上的元素进行操作

向数组中的对象添加键而不改变原始变量

无法避免UV:flat的插值:非法使用保留字"

如何使用<;Link>;执行与JS Reaction中的";window.Location=/GameOverDied;";类似的操作?

构建器模式与参数对象输入

如何修复错误&语法错误:不能在纯react 项目中JEST引发的模块&之外使用导入语句?

顶点图使用组标签更新列之间的条宽

在JavaScript中,有没有一种方法可以迭代字符串的词法标记?

如何在尚未创建的鼠标悬停事件上访问和着色div?

Promise.race()返回已解析的promise ,而不是第一个被拒绝的promise

React数组查找不读取变量