【问题标题】:Compare two objects with specified keys in TS比较 TS 中指定键的两个对象
【发布时间】:2021-08-16 18:06:02
【问题描述】:

我正在尝试比较两个对象,但仅使用三个键而不是所有键。它看起来像这样:

Object.keys(StateA)
   .filter((k) => [k == 'name', 'x', 'y'])
   .every((k) => StateA[k] == StateB[k])
)

我得到了错误的结果;我做错了什么?

【问题讨论】:

    标签: javascript typescript object


    【解决方案1】:

    如果您已经拥有/知道要比较的键,则无需过滤键;照原样使用every

    const A = { a: 0, b: 1, c: 2, x: 3, y: 4, z: 5 };
    const B = { a: 0, b: 2, c: 3, x: 3, y: 4, z: 6 };
    
    const match = ['a', 'x', 'y'].every(key => A[key] === B[key]);
    console.log(match);

    请记住,像这样的简单检查可能会给您带来误报 - 这取决于您想要什么。一种情况是一个对象中缺少一个键,但另一个对象中存在undefined。如果是这种情况,您可能还需要检查密钥是否存在:

    const A = { a: 0, b: 1, c: undefined };
    const B = { a: 0, b: 1 };
    const keys = ['a', 'b', 'c'];
    
    const match = keys.every(key => A[key] === B[key]);
    
    console.log(match); // true
    
    const stricterMatch = keys.every(key => (
      key in A && key in B && A[key] === B[key]
    ));
    
    console.log(stricterMatch); // false

    【讨论】:

      【解决方案2】:
      
      export function hasSameProps (source: Record<string,unknown>, target: Record<string,unknown>) {
          Object.keys(source).every(key => target.hasOwnProperty(key));
      
      

      for (const key in ObjA) {
         const current = ObjB[key];
      
         if (!current) {
             // does not exists
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-10
        • 1970-01-01
        • 1970-01-01
        • 2012-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多