如何确定 TypeScript 中的两个字符串是否相同?

How to find out if two Strings are the same in TypeScript?

我有一个包含一些字符串的数组,我想遍历该数组以检查我没有两个相同的字符串。

在 java/javascript 中,我会像下面那样使用 equals() 方法,但这似乎不起作用。

array: Array<any> = [];
for(var i = 1; i < array.length; i++){
  if(array[i].equals(array[i-1])){
    array.splice(i);
  }
}

是否有任何其他功能或简单的方法可以做到这一点?

您需要使用 == 运算符或 === 运算符(更多关于差异的信息:Which equals operator (== vs ===) should be used in JavaScript comparisons)。

所以:

for(var i = 1; i < array.length; i++){
  if(array[i] === array[i-1]){
    array.splice(i);
  }
}

但是你需要对数组进行排序才能工作。
这是一个替代实现:

let array = ["one", "two", "one", "three", "two", "four", "one"];

array.sort((a, b) => {
    if (a < b) return -1;
    if (a > b) return 1;
    return 0;
}).filter((item, index) => item !== array[index - 1]); // ["four", "one", "three", "two"]

(code in playground)


编辑

如果您的数组包含日期,那么您应该这样做:

for(var i = 1; i < array.length; i++){
  if(array[i] == array[i-1]){
    array.splice(i);
  }
}

for(var i = 1; i < array.length; i++){
  if(array[i].toString() === array[i-1].toString()){
    array.splice(i);
  }
}

恐怕您提出的算法将无法工作,除非字符串数组已排序,因此重复条目彼此相邻。

如果数组的大小很小,一个非常直接的解决方案是遍历数组两次,如下所示:

for (var i = 0; i < array.length; i++)
  for(var j = i+1; j < array.length; j++)
    if (array[i] == array[j])
      array.splice(j);

其他经典方法包括预先对数组进行排序,然后然后做你正在做的事情,或者使用对象/哈希集来过滤元素。

这是一个使用 reduce & Object.key 的版本。

它在性能上应该也很不错,因为它使用对象字面量作为一种查找。

let array = ["one", "two", "one", "three", "two", "four", "one"];

let deduped = Object.keys(array.reduce((c,a) => { c[a]=true; return c; },{}))

console.log(deduped);