2016-12-24 3 views
3

Я использовал nest() в d3js, чтобы сгруппировать кучу насекомых по индексу Pain, но у меня возникли проблемы с доступом к свойству. Там есть similar question, но я продолжаю получать undefined вместо имени и ценности свойства. Это данные, которые я имею дело с:Как получить значения ключей вложенных наборов данных в D3

Array[6] 
0: Object 
1: Object 
2: Object 
3: Object 
4: Object 
5: Object //expanded below 
     key: "4" 
     values: Array[3] 
     0: Object 
      Insect: "Tarantula Hawk" // I'm trying to access this object inside an object 
      PainIndex: "4" 

Я думал, что-то, как это будет работать, так как d.values дает массив, организованный PainIndex, но печатает undefined в моей консоли:

var eachPain = d3.values(data_group).map(function(d){console.log(d.values); return d.values.Insect})

Мне любопытно узнать, как получить доступ к объектам Insect или PainIndex. Любая помощь очень оценена

ответ

3

values это массив. Похоже, вы хотите первый экземпляр. Попробуйте это:

var eachPain = d3.values(data_group).map(function(d){ return d.values[0].Insect }); 

EDIT:

var eachPain = d3.values(data_group).map(function(d) { 
    return d.values.map(function(v) { return v.Insect; }).join(', '); 
}); 
+0

Можно ли найти все экземпляры в каждом массиве? – st4rgut

+1

@ st4rgut Смотрите мое редактирование. Я думаю, это то, что ты имеешь в виду. – Jack

1

Просто, чтобы добавить больше информации, кроме того, в принятом ответе:

Если вы хотите получить конкретное насекомое, и если вы знать, что это позиция в массиве (как вам кажется): это то, что вам нужно:

var someInsect = data_group[i].values[j].insect; 
     //outer object ----^   ^---- inner object 

В этой области индекс i относится к внешнему объекту со всеми насекомыми с заданной болью в уровне. Затем внутри него индекс j относится к внутреннему объекту с определенным насекомым.

Например, проверьте следующее демо (я использую <pre> для загрузки данных), где я получаю данные и гнездю их так, как вы это делали. В этой демонстрации, чтобы получить тарантул ястреб, я использую:

var someInsect = data_group[0].values[1].insect; 

var data = d3.csvParse(d3.select("#data").text()); 
 

 
var data_group = d3.nest() 
 
    .key(d => d.painIndex) 
 
    .entries(data); 
 

 
var someInsect = data_group[0].values[1].insect; 
 

 
console.log(someInsect);
pre { 
 
    display: none; 
 
}
<script src="https://d3js.org/d3.v4.min.js"></script> 
 
<pre id="data">insect,painIndex 
 
fire ant,4 
 
honey wasp,1 
 
warrios wasp,3 
 
paper wasp,1 
 
velvet ant,2 
 
tarantula hawk,4 
 
bullet ant,4</pre>

Конечно, эта переменная будет меняться в зависимости от насекомого вы хотите.

Другая возможность - получить уровень боли любого насекомого, которого вы хотите по имени. В вашем вложенном массиве, что может быть сделано с:

var filtered = [].concat.apply([], data_group.map(function(d) { 
    return d.values 
})).filter(function(d) { 
    return d.insect === myInsect 
})[0].painIndex; 

Где myInsect имеет название насекомого вы будете использовать в filter.

Проверить это другое демо, где мы получаем значение боли тарантула ястреба:

var data = d3.csvParse(d3.select("#data").text()); 
 

 
var data_group = d3.nest() 
 
    .key(d => d.painIndex) 
 
    .entries(data); 
 

 
var myInsect = "tarantula hawk" 
 

 
var filtered = [].concat.apply([], data_group.map(function(d) { 
 
    return d.values 
 
})).filter(function(d) { 
 
    return d.insect === myInsect 
 
})[0].painIndex; 
 

 
console.log(filtered);
pre { 
 
\t display: none; 
 
}
<script src="https://d3js.org/d3.v4.min.js"></script> 
 
<pre id="data">insect,painIndex 
 
fire ant,4 
 
honey wasp,1 
 
warrios wasp,3 
 
paper wasp,1 
 
velvet ant,2 
 
tarantula hawk,4 
 
bullet ant,4</pre>

Конечно, все это (получение ключевых значений, получить значение в зависимости от другое значение и т. д.) было бы проще, если бы вы использовали свой оригинал, а не вложенный.

Смежные вопросы