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

时间:2015-08-20 06:32:10

标签: javascript d3.js

我正在开发一个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()设置函数,它们将SetIterator对象传递给d3.max(),但也返回undefined。目前,Chrome中似乎不支持使用Array.from

有什么建议吗?我意识到这可能是特定于浏览器的,因为Set对象会被推出;我正在开发Chrome v44。我还考虑过将对象对象用作字典,但无法找到一种简洁的方法来获得最大/最小值来处理该结构。

编辑:我最初使用数组和数字混合作为设置元素来问这个问题。如上所述,仅在使用元素时Chrome仍会出现此问题

4 个答案:

答案 0 :(得分:2)

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) ); 

答案 1 :(得分:0)

对于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()可以与散布运算符一起使用:

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

答案 2 :(得分:0)

您可以使用 option_name

在一行中找到最大值和最小值
apply

答案 3 :(得分:0)

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

var mySet = new Set();
mySet.add(5);
mySet.add(10);
mySet.add(20);
console.log(d3.max(mySet));  // prints 20
<script src="https://d3js.org/d3.v7.js"></script>