2017-02-20 3 views
1

Я извлекаю записи из mongodb .find() и пытается вложить их в d3v4 .stratify(). К сожалению, я получаю ошибкуВложение JSON с d3v4 .stratify()

Error: ambiguous: Product Line 1

я предполагаю, что я непонимание API documentation.

Хотя проблема кажется близкой к this post, я не думаю, что это совсем то же самое. Однако в результате я пытаюсь добраться до чего-то like this.

Может кто-нибудь помочь мне понять, как правильно использовать .stratify()? Или предложить более простой способ сделать это?

Мой результирующий набор (mongodb_data) невелик (может быть, ~ 2500 изделий).

Моего плоский mongodb_data выглядит так,

[ 
    { 
    "name": "Product Line 1", 
    "reference": "product 1.A identifier" 
    }, 
    { 
    "name": "Product Line 1", 
    "reference": "product 1.B identifier" 
    }, 
    { 
    "name": "Product Line 2", 
    "reference": "product 2.A identifier" 
    }, 
    { 
    "name": "Product Line 2", 
    "reference": "product 2.B identifier" 
    } 
]; 

Нужные иерархические/вложенные данные должны выглядеть так,

{ 
"name": "Master Product Catalog", 
"children": [ 
      { 
       "name": "Product Line 1", 
       "children": [ 
          { "name": "product 1.A identifier" }, 
          { "name": "product 1.B identifier" } 
          ] 
      }, 
      { "name": "Product Line 2", 
       "children": [ 
          { "name": "product 2.A identifier" }, 
          { "name": "product 2.B identifier" } 
          ] 
      } 
      ] 
} 

Я использую пример из документации API следующим образом,

var stratdata = d3.stratify() 
        .id(function(d) { return d.name; }) 
        .parentId(function(d) { return d.name; }) 
        (mongodb_data); 

ответ

0

Ваши плоские данные не представляют собой иерархическую структуру. Он не отвечает на вопрос, кто имеет родительскую линию «Product Line 1» или «Product Line 2»? Кроме того, ваше свойство name не содержит как родительскую, так и дочернюю информацию (ссылка является родительской, имя - дочерним). Данные до d3.stratify() должны выглядеть следующим образом:

[{ 
    "reference": "Master Product Catalog", 
    "name": "" //<-- has no parent 
}, { 
    "reference": "Product Line 1", 
    "name": "Master Product Catalog" //<-- parent is master 
}, { 
    "reference": "Product Line 2", 
    "name": "Master Product Catalog" 
}, { 
    "name": "Product Line 1", 
    "reference": "product 1.A identifier" 
}, { 
    "name": "Product Line 1", 
    "reference": "product 1.B identifier" 
}, { 
    "name": "Product Line 2", 
    "reference": "product 2.A identifier" 
}, { 
    "name": "Product Line 2", 
    "reference": "product 2.B identifier" 
}]; 

Running код:

<!DOCTYPE html> 
 
<html> 
 

 
<head> 
 
    <script data-require="[email protected]" data-semver="4.0.0" src="https://d3js.org/d3.v4.min.js"></script> 
 
</head> 
 

 
<body> 
 
    <script> 
 
    var json = [{ 
 
     "reference": "Master Product Catalog", 
 
     "name": "" 
 
    }, { 
 
     "reference": "Product Line 1", 
 
     "name": "Master Product Catalog" 
 
    }, { 
 
     "reference": "Product Line 2", 
 
     "name": "Master Product Catalog" 
 
    }, { 
 
     "name": "Product Line 1", 
 
     "reference": "product 1.A identifier" 
 
    }, { 
 
     "name": "Product Line 1", 
 
     "reference": "product 1.B identifier" 
 
    }, { 
 
     "name": "Product Line 2", 
 
     "reference": "product 2.A identifier" 
 
    }, { 
 
     "name": "Product Line 2", 
 
     "reference": "product 2.B identifier" 
 
    }]; 
 

 
    var root = d3.stratify() 
 
     .id(function(d) { 
 
     return d.reference; 
 
     }) 
 
     .parentId(function(d) { 
 
     return d.name; 
 
     }) 
 
     (json); 
 

 
    console.log(root) 
 
    </script> 
 
</body> 
 

 
</html>

+0

Хммм, интересно. Он работает на стороне клиента внутри моих тегов

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