打字稿:如何在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)

工作范例https://stackblitz.com/edit/typescript-2uminr

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个对象之间找到匹配的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中组合对象属性?

打字稿:如何制作接受对象的类型,其键匹配通用但所有值都是值参数的映射函数

如何计算打字稿中两个日期之间的时间

如何让 Jest 自定义匹配器在打字稿中工作?

打字稿中对象文字的类型安全合并

打字稿如何将ajax对象分配给属性? [复制]