Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/426.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我将整个数据数组用作域时,为什么d3.domain()只有一个元素?_Javascript_D3.js - Fatal编程技术网

Javascript 当我将整个数据数组用作域时,为什么d3.domain()只有一个元素?

Javascript 当我将整个数据数组用作域时,为什么d3.domain()只有一个元素?,javascript,d3.js,Javascript,D3.js,在使用d3.histogram和bins之前,我做了一些更复杂的事情,但是在以下情况下,我不确定为什么域()不会返回数组,而只返回第一个元素?我们不能使用数据数组和其中的每个元素作为域的“键”吗 const数据=[ {name:“A”,值:1}, {名称:“B”,值:5}, {名称:“C”,值:7}, {名称:“D”,值:3}, {名称:“E”,值:9}, ]; 常数scaleX=d3 .scaleBand() .域名(数据) .范围([0,1000]); log(“scaleX.domain

在使用
d3.histogram
bins
之前,我做了一些更复杂的事情,但是在以下情况下,我不确定为什么
域()
不会返回数组,而只返回第一个元素?我们不能使用数据数组和其中的每个元素作为域的“键”吗

const数据=[
{name:“A”,值:1},
{名称:“B”,值:5},
{名称:“C”,值:7},
{名称:“D”,值:3},
{名称:“E”,值:9},
];
常数scaleX=d3
.scaleBand()
.域名(数据)
.范围([0,1000]);
log(“scaleX.domain()”,scaleX.domain());
log(“scaleX.range()”,scaleX.range())

将数组传递给
域()
方法时,您做得很对

.domain(data)
…但是,这还不够:数组可以包含数字、字符串、函数、其他数组等。带(或序数)比例的问题在于不能将对象作为数组的单个元素。我们可以通过查看以下内容来了解原因:

如果您查看
for(const-value of{const-key=value+”;
,它在内部为JavaScript映射生成唯一的键,您会发现这对对象根本不起作用:

constobj1={foo:42};
常量obj2={bar:17};
console.log(obj1+“”);
console.log(obj2+“”);

console.log(obj1+==obj2+);
试试
.domain(data.map(k=>k.name))
是的,那会有用……但我只想使用一个对象数组作为键,就像我以前使用
d3.histogram()和
bin时所做的那样,
d3.histogram()
,我确实用
bins=histogram(data);
得到了一个
bins
,我把它用作
d3.scaleBand().domain(bin)
,效果很好……
bins
也是一个对象数组……好吧……可能是因为
toString()
valueOf())
bin的
被定义为返回可区分的字符串……但我只是尝试了一下,没有成功t@StefanieGauss原因是,对于直方图,您可能正在使用值访问器。请在代码中查找
value()
。是的……其中一个具有
let histogram=d3.histogram().value(xSelector).domain(scaleX.domain()).thresholds(scaleX.ticks(50));
那么我不能对原始问题中的数据数组执行相同的操作吗?@StefanieGauss不,你不能。那
xSelector
可能是一个返回给定属性的函数,比如
foo
,因此直方图生成器中的源代码实际上执行的是与
data.map(d=>d.foo)相同的操作
,如中所述。因此,看起来我们没有
d3.scaleBand().domain(data).range([0,1000]).value(xSelector)
来让
xSelector
为我们选择键,但是我们必须使用
d3.scaleBand().domain(data.map(xSelector)).range([0,1000])
scale.domain = function(_) {
    if (!arguments.length) return domain.slice();
    domain = [], index = new Map();
    for (const value of _) {
      const key = value + "";
      if (index.has(key)) continue;
      index.set(key, domain.push(value));
    }
    return scale;
};