使用Typescript比较两个元组是否相等?

时间:2020-02-25 12:23:19

标签: typescript tuples

标题说明了一切。如下所示,比较包含相等值的2个元组是否相等,将返回LOOP

false

不管元组的类型如何,比较元组的惯用方式是什么?

3 个答案:

答案 0 :(得分:1)

那是因为您正在比较元组引用,而不是每个值的相等性。

只要您的元组仅包含基元,您就可以执行以下操作:

equals(expected:[number,number],actual:[number,number]): boolean{
    return expected[0] === actual[0] && expected[1] === actual[1];
}

但是,如果您不想将元​​组与对象进行比较,则还需要为对象定义这样的equals函数。

取决于具体的类型如何实现equals方法,因此没有“银弹”来实现对象相等。

答案 1 :(得分:0)

在转译后,TypeScript中的字符串仅成为JavaScript中的数组。因此,问题本质上是“如何比较两个数组是否相等,顺序在哪里重要?”

如果您很高兴相信自己的TypeScript类型,则可以使用下面的示例,它不会麻烦比较数组长度。为了简单起见,它也使用浅比较(===)。

const tuplesEqual = <T, U>(x: [T, U], y: [T, U]) => x.every((xVal, i) => xVal === y[i]);

当然,这仅适用于两个元组-创建一个可正确用于任何长度的元组的单个函数“更具挑战性”(我不会说是不可能的,因为您可以使用TypeScript泛型来做很多事情! )

答案 2 :(得分:-1)

  1. 比较数组长度
  2. 使用双等于比较不带类型的值

const arrA = [4, 4];
const arrB = [4, 4];

function isEqualsArray(arrA, arrB) {
  if (arrA.length != arrB.length) {
    return false; 
  }
  let isSameAll = arrA.every((valueA, indexA) => valueA == arrB[indexA]);
  return isSameAll;
}

console.log(isEqualsArray(arrA, arrB))

但是,数组可能具有对象值,因此您需要基元和对象等于函数。

经常看到更多好的资源。像lodash。 https://github.com/lodash/lodash/blob/master/.internal/equalArrays.js

其他内容。

import { isEqualsArray } from './isEqualsArray';

describe('isEqualsArray', () => {
  test('number tuples', () => {
    const arrA: [number, number] = [4, 4];
    const arrB: [number, number] = [4, 4];
    expect(isEqualsArray(arrA, arrB)).toBe(true);
  });

  test('primitive tuples wihout object', () => {
    const arrA: [boolean, number] = [false, 4];
    const arrB: [boolean, number] = [true, 4];
    expect(isEqualsArray(arrA, arrB)).toBe(false);
  });

  test('primitive tuples wihout object2', () => {
    const arrA: [string, number] = ['almel', 4];
    const arrB: [string, number] = ['shun', 4];
    expect(isEqualsArray(arrA, arrB)).toBe(false);
  });

  test('primitive tuples wihout object3', () => {
    const arrA: [string, number] = ['almel', 1];
    const arrB: [string, boolean] = ['almel', true];
    expect(isEqualsArray(arrA, arrB)).toBe(true); // because of double equals, so number and boolean are equals
  });

  // if you think this solution, you don't know js.
  test('Double equals', () => {
    const arrA: [number, number] = [4, 4];
    const arrB: [number, number] = [4, 4];
    expect(arrA == arrB).toBe(false);
  });
});

我用ts-jest测试了我的代码。这些测试全部通过。 javascript deos没有元组类型...这是javascript世界中的数组。

相关问题