Я работаю над этим фрагментом кода, цель которого - создать массив всех значений, которые дублируются из другого массива. Результирующий массив, который я хотел бы иметь, должен вводить только повторяющиеся значения из первого массива один раз. Проблема в том, что я не могу использовать какие-либо функции или методы массива . Вот что у меня есть на данный момент:

var numbers = [8,24,20,5,13,3,1,12,11,24,8,24,20,4,5,23,24,23,21,2,19,3,21,2,14,17,21,5,7,10,20,11,0,5,18,2,13,11,14,3,20,1,23,6,21,10,14,0,15,20];

var results = [];
var tempArr = [];

for (var i = 0; i <= numbers.length; i++) {
  if (tempArr[numbers[i]] === undefined) {
    tempArr[numbers[i]] = 1;
  } else if (results[numbers[i]] === undefined)  {
    results.push(numbers[i]);
  }
}

console.log(tempArr);
console.log(results);

Я приближаюсь к желаемому результату… но по какой-то причине массив результатов продолжает содержать несколько записей значений, которые дублируются в массиве чисел. Где я здесь ошибаюсь?

0
Brian Hernandez 17 Апр 2018 в 03:21

1 ответ

Лучший ответ

Вы в основном злоупотребляете массивом как объектом. Попробуйте вместо этого использовать объект для регистрации ваших значений (и дайте названному объекту имя, которое представляет то, что он содержит), это значительно упростит ваш код:

var numbers = [8,24,20,5,13,3,1,12,11,24,8,24,20,4,5,23,24,23,21,2,19,3,21,2,14,17,21,5,7,10,20,11,0,5,18,2,13,11,14,3,20,1,23,6,21,10,14,0,15,20];

var results = [];
var seenValues = {};

for (var i = 0; i < numbers.length; i++) {
  const number = numbers[i];
  seenValues[number] = 1 + (seenValues[number] || 0);
  // check to see if it's been seen exactly once before,
  // so that the duplicated value is only added once:
  if (seenValues[number] === 2) results[results.length] = number;
}

//console.log(seenValues);
console.log(results);
1
CertainPerformance 17 Апр 2018 в 00:29