D3 Как создать новый массив из многоуровневого объекта? - PullRequest
0 голосов
/ 16 марта 2020

Я новичок в 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"]

Как правильно получить только значение x для формирования массива в d3?

Большое спасибо

1 Ответ

0 голосов
/ 17 марта 2020

Я сделал изменения в значениях "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
}))

Это даст вам массив, как вы ожидали ["ноль" , "one", "two"].

Приведенное выше решение предназначено для случаев, когда у вас есть фиксированные метки x, но если вы хотите пройти 1011 * через каждый элемент, чтобы увидеть или добавить больше, вы можете использовать этот подход или для generi c решение

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
}
...