D3 如何创建一个新的数组形式的多级对象?

D3 How to create a new array form multi level object?

我是 D3 的新手(使用 v3) 我的数据结构如下:

var data=[
{"name":"airport","values":[
        {"x":zero ,"y":333},
        {"x":one,"y":138},
        {"x":two,"y":118}
    ]},
{"name":"train","values":[
        {"x":zero,"y":136},
        {"x":one,"y":217},
        {"x":two,"y":109}
    ]},
{"name":"car","values":[
        {"x":zero,"y":132},
        {"x":one,"y":244},
        {"x":two,"y":145}
    ]}
]

我想用data.map重新映射一个数组,格式如下

["zero", "one", "two"]

在d3中只获取x值形成数组的正确方法是什么?

非常感谢

我对 "x" 值进行了如下更改 我刚刚向每个元素添加了“”。因为它不是数字,所以将被视为字符串

        {"x":"zero","y":333},
        {"x":"one","y":138},
        {"x":"two","y":118}

对于您的情况,您只需添加

d3.scale.ordinal().domain(data[0].values.map(function(element){
        return element.x
}))

它会给你数组,正如你所期望的那样 ["zero", "one", "two"].

以上解决方案适用于当你有固定 x 标签但如果你想遍历每个元素以查看或添加更多你可以使用这种方法或通用解决方案

d3.scale.ordinal().domain(filter(data))

function filter(localData){
  var tempdata = []
  localData.forEach(function (element){
      return element.values.forEach(function(element){
        tempdata.push(element.x)
    })
  })
  var uniqueArray = tempdata.filter(function(item, pos, self) {
    return self.indexOf(item) == pos;
  })
  return uniqueArray
}