返回值基于同一对象中另一个值的最大值/最小值

时间:2019-05-20 19:02:09

标签: javascript d3.js

具有以下对象:

var obj = [
 {'a':1, 'b':'jack'},
 {'a':2, 'b':'mario'},
 {'a':3, 'b':'dan'}
]

使用基于“ a”但返回“ b”的d3.extent()的最正确方法是什么。

以下一行

d3.extent(obj, function(d) {return d.a})

将导致:

[1,3]

我想得到的结果是:

['jack','dan']

2 个答案:

答案 0 :(得分:1)

简介:答案已经删除了此问题的正确答案(> 10k用户可以看到),可能是在收到反对意见之后。根据{{​​3}},我正在将他的答案复制为社区Wiki答案,并添加一些我自己的信息。我也投票决定不删除他的答案。


您无法使用d3.extent做您描述的事情,但是您可以使用d3.extent和一些普通的JavaScript轻松地做到这一点。

但是,如果只想使用D3方法,则可以使用this meta suggestiond3.minIndex。就像这样简单:

var myDesiredOutput = [
  obj[d3.minIndex(obj, d => d.a)].b,
  obj[d3.maxIndex(obj, d => d.a)].b
];

这是演示:

var obj = [{
    'a': 1,
    'b': 'jack'
  },
  {
    'a': 2,
    'b': 'mario'
  },
  {
    'a': 3,
    'b': 'dan'
  }
];

var myDesiredOutput = [
  obj[d3.minIndex(obj, d => d.a)].b,
  obj[d3.maxIndex(obj, d => d.a)].b
];

console.log(myDesiredOutput)
<script src="https://d3js.org/d3-array.v2.min.js"></script>

请注意您必须引用d3-array小型库...

<script src="https://d3js.org/d3-array.v2.min.js"></script>

...因为在撰写本文时,d3.minIndexd3.maxIndex都不是默认捆绑软件的一部分。

答案 1 :(得分:0)

d3-array版本2.3开始,可以使用d3.leastd3.greatest以便根据指定字段分别获取指定可迭代对象的最小/最大元素:

d3.least(obj, d => d.a); // { 'a': 1, 'b': 'jack' }

因此可轻松访问包含最小和最大元素的子字段:

var min = d3.least(obj, d => d.a).b;    // jack
var max = d3.greatest(obj, d => d.a).b; // dan

例如:

var obj = [
  { 'a': 1, 'b': 'jack' },
  { 'a': 2, 'b': 'mario' },
  { 'a': 3, 'b': 'dan' }
];

var min = d3.least(obj, d => d.a).b;
var max = d3.greatest(obj, d => d.a).b;

console.log(min);
console.log(max);
<script src="https://d3js.org/d3-array.v2.min.js"></script>