要推断出网站的结构并为每个页面节点标注上级别信息和父节点,我们可以使用广度优先搜索(BFS)或深度优先搜索(DFS)来遍历页面间的跳转关系。以下是一个使用 JavaScript 实现的示例代码:
function analyzeWebsiteStructure(nodes, links) {
// 创建一个映射以便快速查找节点
const nodeMap = {};
nodes.forEach(node => {
nodeMap[node.id] = { ...node, level: null, parent: null };
});
// 创建一个邻接表来表示页面间的跳转关系
const adjacencyList = {};
links.forEach(link => {
if (!adjacencyList[link.source]) {
adjacencyList[link.source] = [];
}
adjacencyList[link.source].push(link.target);
});
// BFS 或 DFS 来遍历页面
const queue = [];
const visited = new Set();
// 假设第一个节点是首页
const rootNodeId = nodes[0].id;
queue.push(rootNodeId);
nodeMap[rootNodeId].level = 0; // 设置首页级别为0
while (queue.length > 0) {
const currentNodeId = queue.shift();
visited.add(currentNodeId);
const neighbors = adjacencyList[currentNodeId] || [];
neighbors.forEach(neighborId => {
if (!visited.has(neighborId)) {
// 设置邻居节点的级别和父节点
const currentLevel = nodeMap[currentNodeId].level;
nodeMap[neighborId].level = currentLevel + 1;
nodeMap[neighborId].parent = currentNodeId;
// 将邻居节点加入队列
queue.push(neighborId);
}
});
}
// 将结果转换为数组
const result = Object.values(nodeMap);
return result;
}
// 示例数据
var nodes = [
{ id: '1', name: '首页', pv: 10000 },
{ id: '2', name: '页面2', pv: 5000 },
{ id: '3', name: '页面3', pv: 3000 },
{ id: '4', name: '页面4', pv: 2000 },
];
var links = [
{ source: '1', target: '2', weight: 1000 },
{ source: '1', target: '3', weight: 1000 },
{ source: '2', target: '4', weight: 500 },
];
// 调用函数
const structuredNodes = analyzeWebsiteStructure(nodes, links);
console.log(structuredNodes);
代码说明:
- 节点映射:首先,我们将节点信息存储在一个对象中,以便快速查找。
- 邻接表:我们使用一个对象来表示页面间的跳转关系,方便后续遍历。
- 广度优先搜索:从假设的首页开始,遍历所有可达的页面,设置每个页面的级别和父节点。
- 结果输出:最后,将处理后的节点信息转换为数组并返回。
注意事项:
- 该算法假设第一个节点是首页。如果有多个首页或入口页面,需要根据具体情况调整。
- 该实现没有处理循环跳转的情况,实际应用中可能需要添加相应的逻辑来避免无限循环。