Доступ к элементам nest по их ключам с помощью d3.js

#javascript #d3.js

#javascript #d3.js

Вопрос:

Итак, у меня есть следующее гнездо:

 var myNest = [
  {"key":"1","values":[...]},
  {"key":"2","values":[...]},
  {"key":"3","values":[...]},
]
  

Как я могу получить доступ к этим элементам, используя их ключи?

Я знаю, что могу получить к ним доступ по их индексу

 myNext[0] //return elements with key=="1"
myNest[1] //return elements with key=="2"
  

Но то, что я хотел бы сделать, это:

 myNest["1"] //return elements with key=="1"
myNest["2"] //return elements with key=="2"
  

Спасибо

Ответ №1:

Используйте map() вместо entries() при создании вашего nest. Вы, вероятно, сделали что-то похожее на это:

 var products = [{
  "id": 1,
  "name": "Cat Hat",
  "price": 49
}, {
  "id": 2,
  "name": "Unicorn Boots",
  "price": 139
}, {
  "id": 3,
  "name": "Pink Woolly Jumper",
  "price": 34
}];


var productsById = d3.nest()
  .key(function(p) {
    return p.id;
  })
  .entries(products);

console.log(productsById)  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>  

Если вместо этого вы используете map() :

 var products = [{
  "id": 1,
  "name": "Cat Hat",
  "price": 49
}, {
  "id": 2,
  "name": "Unicorn Boots",
  "price": 139
}, {
  "id": 3,
  "name": "Pink Woolly Jumper",
  "price": 34
}];


var productsById = d3.nest()
  .key(function(p) {
    return p.id;
  })
  .map(products);

console.log(productsById)  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>  

Вы получаете карту, на которой вы можете напрямую обращаться к объектам по их ключу, например, с помощью productsById["2"] в этом примере.

Ответ №2:

Вы могли бы использовать хэш-таблицу, где ключ вашего объекта является ключом для самого объекта.

Для ES6 я предлагаю использовать карту:

 var myNest = [{ key: "1", values: [1, 4] }, { key: "2", values: [2, 5] }, { key: "3", values: [3, 6] }],
    hash = Object.create(null);

myNest.forEach(function (a) {
    hash[a.key] = a;
});

console.log(hash['2']);