javascript - 如何找到两个对象最近的共同祖先类?
问题描述
这个问题基本上相当于 JavaScript如何找到两个非接口类的最近公共超类
TL;DR:给定两个对象和一个广泛的继承设置,我怎样才能找到它们最近的公共类?
假设程序中有几个相关的类,它们的层次结构如下:
class A {}
class B extends A {}
class C extends B {}
class D extends B {}
class E extends D {}
给定对 的实例C
和 的实例的E
引用,我想获得对 的引用B
,因为这是它们最接近的共同祖先。
function getClosestCommonAncestorClass(c: C, e: E): typeof B;
我怎么做?
解决方案
这是一个树问题(最低共同祖先),其中边由 确定Object.getPrototypeOf
。
这个想法是从根节点获取两个给定节点的路径,然后比较从根节点开始的这两个路径中的条目。最后一个相同的节点是公共节点。最后得到那个原型对象的构造函数,也就是“类”:
function getPath(o) {
const path = [];
while (o) {
path.push(o);
o = Object.getPrototypeOf(o);
}
return path.reverse();
}
function getClosestCommonAncestorClass(x, y) {
const xPath = getPath(x);
const yPath = getPath(y);
const steps = Math.min(xPath.length, yPath.length);
let i = 0;
for (; i < steps; i++) {
if (xPath[i] !== yPath[i]) break;
}
return xPath[i - 1]?.constructor;
}
class A {}
class B extends A {}
class C extends B {}
class D extends B {}
class E extends D {}
console.log(getClosestCommonAncestorClass(new C(), new E())); // class B
推荐阅读
- node.js - 从 github node.js 部署应用程序错误 heroku
- python - 如何从具有数字和非数字数据的 pandas DataFrame 中删除异常值
- amazon-web-services - 没有“www”的域名不适用于 CloudFront
- loops - 嵌套while循环将字符串从一个文件复制到另一个文件
- python - 搜索模型时,django 返回 2 个相同的结果?
- asp.net-mvc - ASP.NET Core MVC - 添加新的“Razor View - Empty”时出现错误
- newline - 如何禁用删除`⏎`eslintprettier/prettier
- express - 无法使用使用 sequelize-typescript 的查找功能
- reactjs - 在打字稿中处理 useRef(null) 的最佳方法
- c - 为什么 *c++ 增加指针值而不是第一个 Char 的 ascii?