打字稿:如何在2个对象之间找到匹配的属性
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了打字稿:如何在2个对象之间找到匹配的属性相关的知识,希望对你有一定的参考价值。
我有2个具有嵌套属性的对象,如下所示:
const obj1 = {
prop1: {
val1: 10,
val2: 11,
val3: 12,
},
prop2: {
val1: 10,
diff1: true,
},
prop4: {
text1: 't1',
text99: 't1',
}
};
const obj2 = {
prop1: {
val99: 1000,
val2: 1100,
val33: 1200,
},
anotherOne: {
val1: 1000,
diff1: false,
},
prop4: {
check: true,
text1: 't100',
text99: 't100',
}
};
如何找到两个对象之间通用的属性?即对于上面的例子,我有兴趣得到以下回复:
const propertiesInObj1AndObj2 = {
prop1: {
val2: '',
},
prop4: {
text1: '',
text99: '',
}
};
有没有一个很好的方法来获得这个结果?或者我是否需要手动迭代obj1中找到的每个属性并在obj2中搜索相同的属性以查看是否存在匹配?
答案
我认为这真的取决于你的用例...你需要支持数组吗?如果两个属性都存在但是不同的类型怎么办?等等等
您将不得不遍历至少一个对象的键,但由于您只对键集的交集感兴趣,因此您不需要迭代两者。当然,该函数必须是递归的。
这是一个可能的实现,也适用于类型级别:
type SameKeyThing<T, U> =
[T, U] extends [object, object] ?
{ [K in (keyof T) & (keyof U)]: SameKeyThing<T[K], U[K]> } : "";
function sameKeyThing<T, U, S=SameKeyThing<T, U>>(x: T, y: U): { [K in keyof S]: S[K] };
function sameKeyThing(x: any, y: any) {
if ((typeof x !== "object") || (typeof y !== "object")) return "";
const ret: any = {};
for (let k in x) {
if (k in y) {
ret[k] = sameKeyThing(x[k], y[k]);
}
}
return ret;
}
const propertiesInObj1AndObj2 = sameKeyThing(obj1, obj2);
// inferred as type { prop1: { val2: ""; }; prop4: { text1: ""; text99: ""; }; }
console.log(propertiesInObj1AndObj2);
这适用于您的示例,但如果您在其上抛出边缘情况(如那些数组),可能会有奇怪的行为。无论如何,希望这会给你一些想法。祝好运!
另一答案
O(n2)
const obj1 = {
prop1: {
val1: 10,
val2: 11,
val3: 12,
},
prop2: {
val1: 10,
diff1: true,
},
prop4: {
text1: 't1',
text99: 't1',
}
};
const obj2 = {
prop1: {
val99: 1000,
val2: 1100,
val33: 1200,
},
anotherOne: {
val1: 1000,
diff1: false,
},
prop4: {
check: true,
text1: 't100',
text99: 't100',
}
};
const duplicate: any[] = [];
Object.keys(obj1).map( ob1 => {
Object.keys(obj2).map( ob2 => {
if (match(ob1, ob2)) { duplicate.push(ob2) }
});
});
function match(key1: string, key2: string) {
return (key1 === key2) ? true : false;
}
console.log(duplicate)
以上是关于打字稿:如何在2个对象之间找到匹配的属性的主要内容,如果未能解决你的问题,请参考以下文章