【问题标题】:Compare the contents of two objects比较两个对象的内容
【发布时间】:2021-07-25 17:57:29
【问题描述】:

我有一个 Typescript 项目,我想比较两个包含多个相等字符串的数组。

这些是我要比较的对象:

let fff: object = [ 'CO_SER.csv', 'CO_INS.csv', 'CO_DAT.csv' ];
let sss: object = [ 'CO_SER.csv', 'CO_INS.csv', 'CO_DAT.csv' ];

当比较它们时,它显示我是错误的:

console.log(fff == sss) ==> false

如何比较两个对象的字符串?对象可以以不同的方式排序。如果它们不同,我怎样才能得到不一样的字符串?

【问题讨论】:

    标签: arrays typescript


    【解决方案1】:

    首先要说一句:我不知道您为什么将数组显式键入为object。如果您删除它,TypeScript 将正确推断类型为 string[]

    不要使用===比较内容

    使用=== 将通过引用比较非原始值,如本例中的数组。所以两个不同的数组实例,即使内容相同,也永远不会相等。

    当订单始终相同时使用.every()

    如果数组中的顺序始终相同,可以使用.every,如下:

    fff.every((value, index) => sss[index] === value)
    

    当订单不同时使用Set

    但是,您提到顺序可能不同。在这种情况下,您想使用Set。集合只能包含一个值的实例,并且可以快速告诉您给定值是否是该集合的成员。

    理论上,您正在寻找两组的symmetric difference。这是在任一给定集合中的一组值,但不在两个给定集合中。

    这是一个函数,它将数组转换为集合,计算对称差,并返回一个数组中的一个数组,而不是两个数组:

    function symDifference(values1: string[], values2: string[]): string[] {
      const notTheSame = new Set<string>();
    
      const values1Set = new Set(values1);
      const values2Set = new Set(values2);
    
      for (const value1 of values1Set) {
        if (!values2Set.has(value1)) {
          notTheSame.add(value1);
        }
      }
    
      for (const value2 of values2Set) {
        if (!values1Set.has(value2)) {
          notTheSame.add(value2);
        }
      }
    
      return [...notTheSame];
    }
    
    

    这是一个CodeSandbox,您可以在其中玩。

    最后注

    您可能想使用 Array 的 .includes() 方法而不是使用 Sets。但是,对于较大的数组,复杂性和性能会呈指数级下降,因为这每次都会在数组上循环。

    【讨论】:

      【解决方案2】:

      当您比较它们时,它们的结果会有所不同,因为每个数组在内存中代表不同的reference

      如果您需要检查第一个数组是否包含第二个数组中也存在的字符串,您可以这样做:

      fff.every(e => sss.includes(e))
      

      如果作为第一个参数提供的函数为数组本身的所有元素返回true,则every 方法返回true

      如果您需要提取存在于第一个数组中但不存在于第二个数组中的字符串,那么您可以这样做:

      fff.filter(e => !sss.includes(e))
      

      如果您需要提取两个数组之间的差异,那么您可以使用如下函数:

      const diff = (a1, a2) => {
        const a = []
        const diff = []
      
        for (let i = 0; i < a1.length; i++) {
          a[a1[i]] = true
        }
      
        for (let i = 0; i < a2.length; i++) {
          if (a[a2[i]]) {
            delete a[a2[i]]
          } else {
            a[a2[i]] = true
          }
        }
      
        for (var k in a) {
          diff.push(k)
        }
      
        return diff
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多