Получить уникальные значения массива Javascript - PullRequest
2 голосов
/ 13 октября 2019

Я пытаюсь написать функцию на JavaScript, чтобы получить уникальные значения массива, но мой код работает неправильно. Я знаю, что есть и другие лучшие и более простые способы сделать это, но я не понимаю, почему мой код не работает, и я хочу понять это.

Функция имеет два цикла for, если внешнийИндекс и внутренний индекс различны, и значения этих позиций индекса одинаковы, позиция внутреннего индекса помещается в другой массив. Когда внутренний цикл for заканчивается, индексы, аннотированные в другом массиве, заменяются в исходном массиве нулевыми значениями, которые будут удалены позже.

ввод: 1 2 2 3 3 3 4 4 4 4 55 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);
      }
    }
  }
}

Ответы [ 3 ]

3 голосов
/ 13 октября 2019

Простой способ получить все уникальные значения из массива - преобразовать массив в набор.

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 }
0 голосов
/ 13 октября 2019

Как вы думаете, просто определите функцию следующим образом:

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);, это тоже работает.

0 голосов
/ 13 октября 2019

Вы почти на месте.

splice () Первый параметр метода - это начальный индекс, индекс, с которого начинается изменение массива.

В вашем коде, vector.splice(vector[indexRepeated[i]], 1, null); вы передаете значение по этому индексу в массиве vector вместо этого индекса. Это является причиной неожиданного вывода.

Просто измените эту строку на vector.splice(indexRepeated[i], 1, null); и отфильтруйте null значения.

Live Пример:

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) Использование filter () :

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);
...