Альтернатива Math.max и Math.min для типа BigInt в Javascript - PullRequest
1 голос
/ 20 апреля 2020

В Javascript: Math.max и Math.min не работают для типов BigInt.

Например:

> Math.max(1n, 2n)
Thrown:
TypeError: Cannot convert a BigInt value to a number
    at Math.max (<anonymous>)
>

Есть ли встроенная функция, которая выполняет эти операции на BigInts?

Ответы [ 2 ]

2 голосов
/ 20 апреля 2020

как насчет

const bigIntMax = (...args) => args.reduce((m, e) => e > m ? e : m);
const bigIntMin = (...args) => args.reduce((m, e) => e < m ? e : m);

также, если вы хотите оба, то

const bigIntMinAndMax = (...args) => {
  return args.reduce(([min,max], e) => {
     return [
       e < min ? e : min, 
       e > max ? e : max,
     ];
  }, [args[0], args[0]]);
};

const [min, max] = bigIntMinAndMax(
   BigInt(40),
   BigInt(50),
   BigInt(30),
   BigInt(10),
   BigInt(20),
);
0 голосов
/ 20 апреля 2020

После некоторого гугла кажется, что ответ "нет", Javascript не имеет встроенных функций для этого.

Вот реализация min и max для bigints, которая соответствует сигнатуре встроенных, за исключением того, что он выдает ошибки для пустых списков (вместо возврата +/- Infinity, поскольку BigInt не может представлять бесконечность):

function bigint_min(...args){
    if (args.length < 1){ throw 'Min of empty list'; }
    m = args[0];
    args.forEach(a=>{if (a < m) {m = a}});
    return m;
}

function bigint_max(...args){
    if (args.length < 1){ throw 'Max of empty list'; }
    m = args[0];
    args.forEach(a=>{if (a > m) {m = a}});
    return m;
}
...