Я пытаюсь удалить пустых детей из моего дерева d3js, когда я фильтрую некоторые данные.
Вот мой код, который, я думаю, мне нужно поработать для удаления пустых детей.
// Assigns the x and y position for the nodes
var treeData = treeObject.treemap(treeObject.root);
// Compute the new tree layout.
var nodes = treeData.descendants().filter(function (d) {
if (d.data.children > 0) {
return d.data.value;
}
});
var links = nodes.slice(1);
Кто-нибудь может мне помочь? Спасибо !



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы фильтруете d.data.children > 0, но в вашем примере объекта у вас есть два типа объектов
name, value, children и т. д.Не видя, как вы в первую очередь получаете массив children, я бы посоветовал вам попробовать исправить свой восходящий процесс, который приводит к тому, что в этой коллекции находится пустой массив. В противном случае, вот способ очистить данные, прежде чем вы начнете вводить их в свою диаграмму d3:
let data = {
name: 'Company A',
value: 0,
children: [
{ name: 'Exchanges', value: 0, children: [{...}], type: 'node', url: '#' },
{ name: 'Operations', value: 0, children: [{...}], type: 'node', url: '#' },
{ name: 'Management', value: 0, children: [{...}], type: 'node', url: '#' },
[],
{ name: 'Support', value: 0, children: [{...}], type: 'node', url: '#' }
]
}
const filterFunc = (node) => {
// make sure we are working with the right data here to prevent errors
if (node && node.children && Array.isArray(node.children)) {
// filter out any children which are not objects
// you can put more logic here for even better data hygiene,
// such as checking for required fields like `name`
node.children = node.children.filter(child => !Array.isArray(child));
} else {
// here you can ensure each node has a valid `children` property
node.children = []
}
// recursively call `filterFunc` down the tree until all nodes are validated
node.children.forEach(child => filterFunc(child));
}
// call `filterFunc` on the root node
filterFunc(data);
// I didn't test this part, but you probably need to `.length` your array check
var nodes = treeData.descendants()
.filter(function (d) {
if (d.data.children.length > 0) {
return d.data.value ;
}
});
Спасибо! Это работа по удалению детей. Теперь я пытаюсь перерисовать свое дерево d3js с непустыми дочерними элементами.
Еще раз спасибо!
При локальном тестировании мой оригинальный фильтр
typeof child === 'object'не работал, потому чтоtypeof [] === 'object'. Я обновил ответ, чтобы использовать!Array.isArray(child)вместо нашего фильтра.