2

我正在尝试在 JavaScript 中编写一个函数来获取数组的唯一值,但我的代码无法正常工作。我知道还有其他更好更简单的方法可以做到这一点,但我不明白为什么我的代码不起作用,我想了解它。

该函数有两个for循环,如果外部索引和内部索引不同并且这些索引位置的值相同,则将内部索引的位置推到另一个数组中。当内部 for 循环结束时,在另一个数组中注释的索引在原始数组中被替换为稍后要删除的空值。

输入是:1 2 2 3 3 3 4 4 4 4 5 5 5 5 5

但输出是: 1 2 null null null null 4 4 4 4 5 5 5 5 5

我不知道出了什么问题,有人可以帮我吗?

function uniqueArrayValues(vector) {
  var indexRepeated = [];
  for (let i in vector) {
    for (let j in vector) {
      if (vector[i] == vector[j] && i != j && j != null && i != null && i < j ) {
        indexRepeated.push(j);
      }
    }
    for (let i in indexRepeated) {
      if (vector[indexRepeated[i]] != null) {
        vector.splice(vector[indexRepeated[i]], 1, null);
      }
    }
  }
}
4

3 回答 3

3

从数组中获取所有唯一值的一种简单方法是将数组转换为集合。

let arr = [1,2,2,3,3,3,4,4,4,5,5,5,5,5];

let uniqueArr = new Set(arr);

console.log(uniqueArr); ///Set { 1, 2, 3, 4, 5 }
于 2019-10-13T02:27:22.787 回答
0

你快到了。

splice()方法的第一个参数是开始索引,即开始更改数组的索引。

在您的代码中,vector.splice(vector[indexRepeated[i]], 1, null);您传递的是数组中该索引处的vector而不是该索引。这就是意外输出的原因。

只需将该行更改为vector.splice(indexRepeated[i], 1, null);并过滤null值。

现场示例:

function uniqueArrayValues(vector) {
  var indexRepeated = [];
  for (let i in vector) {
    for (let j in vector) {
      if (vector[i] == vector[j] && i != j && j != null && i != null && i < j) {
        indexRepeated.push(j);
      }
    }

  
    for (let i in indexRepeated) {
      if (vector[indexRepeated[i]] != null) {
        vector.splice(indexRepeated[i], 1, null);
      }
    }
  }
 
  return vector.filter(value => value !== null); // Can also use vector.filter(value => value);
}

var arr = [1,2,2,3,3,3,4,4,4,4,5,5,5,5,5];

console.log(uniqueArrayValues(arr));

以下是从数组中获取唯一值的其他一些更简单的方法。

1)使用过滤器()

var arr = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5];

var unique = arr.filter((value, index, arr) => index === arr.indexOf(value));

console.log(unique);

2) 使用Set()

var arr = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5];

var unique = [...new Set(arr)];

console.log(unique);

于 2019-10-13T02:27:21.170 回答
0

如您所想,只需像这样定义函数;

function uniqueArrayValues(vector) {
  //var indexRepeated = [];
  for (let i in vector) {
    for (let j in vector) {
      if (vector[i] == vector[j] && i < j ) {
        vector[j]=null;
      }
    }

  }
}

indexRepeated 的循环是多余的。顺便说一句,您可以将这些代码更改vector.splice(vector[indexRepeated[i]], 1, null);vector.splice(indexRepeated[i], 1, null);,它也有效。

于 2019-10-13T02:53:50.447 回答