标题说明了一切。如下所示,比较包含相等值的2个元组是否相等,将返回LOOP
false
不管元组的类型如何,比较元组的惯用方式是什么?
答案 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)
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世界中的数组。