查找Javascript集中的最大/最小值

umuewwlo  于 2022-12-10  发布在  Java
关注(0)|答案(5)|浏览(160)

我正在开发一个Javascript和d3.js应用程序,我想在其中跟踪上传的数据集中的唯一值。使用一个新的Javascript Set对象似乎很吸引人,但我找不到一个好方法来提取集合的最大值和最小值。我的代码:

var mySet = new Set();
mySet.add(5);
mySet.add(10);
mySet.add(20);
console.log( d3.max(mySet) );

这会产生undefined而不是20。
我已经尝试了.elements().values().keys() Set函数,它们将SetIterator对象传递给d3.max(),但也返回undefined。Chrome目前似乎不支持使用Array.from
有什么建议吗?我意识到这可能是浏览器特有的,因为Set对象已经推出;我正在Chromev 44上开发,我也考虑过使用对象对象作为字典,但也找不到一种简洁的方法来让max/min与该结构一起工作。
编辑:我最初问这个问题时使用了数组和数字作为集合元素。

3vpjnl9f

3vpjnl9f1#

您可以使用apply在一行中查找最大值和最小值

const mySet = new Set([1, 2, 9, 7, 8]);
Math.max.apply(this, [...mySet]);
Math.min.apply(this, [...mySet]);
w8f9ii69

w8f9ii692#

d3.max只接受一个数组(docs)。现在,您正在向d3.max传递一个集合,如下所示:

{ [5,10,20], 21 }

何时应该传递这样的数组

[5,10,20,21]

以下是您应该如何做:

var mySet = new Set();
mySet.add(5);
mySet.add(10);
mySet.add(20);
mySet.add(21);
myArray = []

// convert set to array
for (v of mySet) {
    myArray.push(v)
}

console.log( d3.max(myArray) );
ma8fv8wu

ma8fv8wu3#

值得注意的是,自从这个问题发布以来已经过去了6年,从D3v6开始,原来的问题不再存在。从那个版本开始(见修改日志),d3-array模块的方法接受迭代。因为Set本身就是iterable,所以原来的代码可以正常工作:
第一个

7y4bm7vi

7y4bm7vi4#

对于Chrome 45+,通过使用Set.prototype.values()Array.from(),应该能够在不创建单独数组的情况下完成此操作,如下所示:

var mySet = new Set([1,2,3,3,2,1]);
var setMax = d3.max(Array.from(mySet.values()));
console.log(setMax);

如果您不想使用d3.max(),则Math.max()与spread运算符也可以使用:

var mySet = new Set([1,2,3,3,2,1]);
var setMax = Math.max(...Array.from(mySet.values()));
console.log(setMax);
uelo1irk

uelo1irk5#

您可以将原生JavaScript解构运算子与搭配使用,以找出Set中的最大值。

const mySet = new Set([5, 10, 20]);

    const maxInSet = Math.max(...mySet);

相关问题