! == Оператор сравнения должен быть правдой, но это не так - PullRequest
0 голосов
/ 23 октября 2018

function nonUniqueElements(data) {
  var duplicates = [];
  var compArr = data;

  for (var i = 0; i < data.length; i++) {
    for (var j = 0; j < compArr.length; j++) {
      console.log('Comparing ' + data[i] + ' to ' + compArr[j]);
      if (data[i] === compArr[j]) {
        console.log('Found match first pass');
        console.log(data.indexOf(i), compArr.indexOf(j));
        if (data.indexOf(i) !== compArr.indexOf(j)) {
          console.log('Also passes second pass')
          console.log('Pushing ' + data[i] + ' to new array')
          duplicates.push(data[i]);
          console.log(duplicates);
        }
      }
    }
    console.log('End of run through');
  }

  return (duplicates);
}

console.log(nonUniqueElements([5, 5, 5, 5]));

Я пытаюсь вернуть все неуникальные значения в массиве.Я продублировал массив и запускаю вложенный цикл для сравнения копии с оригиналом.

Когда он находит совпадение (в данном случае каждый раз), есть вторая проверка, чтобы убедиться, что только значения вразличные индексы помещаются в новый массив.

Я положил console.log () s, чтобы помочь мне пройти через программу.Даже когда console.log (data.indexOf (i), compArr.indexOf (j)) печатает разные значения, блок кода в if (data.indexOf (i)! == compArr.indexOf (j)) оператор не выполняется.

Есть идеи?

Ответы [ 4 ]

0 голосов
/ 23 октября 2018

Вы пытаетесь сравнить два true значения.

Взгляните на определение indexOf:

  • Array.indexOf: метод возвращаетпервый индекс, по которому данный элемент может быть найден в массиве, или -1, если его нет.

  • String.indexOf: метод возвращает индекс в вызывающем Stringобъект первого вхождения указанного значения, начиная поиск с fromIndex.Возвращает -1, если значение не найдено.

Итак, в вашем состоянии if (data.indexOf(i) !== compArr.indexOf(j)) вы сравниваете индексы i и j, которые содержат числа *От 1023 * до 3 (длина данных).В вашем массиве все значения были установлены на 5. Именно поэтому вы получаете -1 взамен indexOf, [5,5,5,5].indexOf(0) === -1.

Если вы пытаетесь сравнить значенияв массиве данных вы должны сравнивать значения, а не индекс значений.Вот так: if (data[i] !== compArr[j]).

В конце я рекомендую вам прочитать этот документ Правда и Ложь: Когда в JavaScript все не равны

0 голосов
/ 23 октября 2018

В JS метод indexOf () возвращает позицию первого вхождения указанного значения в строке / массиве.Вы можете сказать, что это неправильно, поскольку в console.log вы всегда получаете значение -1.Вам нужно сравнить данные [i] и compArr [j].

0 голосов
/ 23 октября 2018
if (data.indexOf(i) !== compArr.indexOf(j)) {

Почему вы сравниваете индексы i и j?i и j сами индексы, а не элементы.Разве вы не имеете в виду

if (data[i] !== compArr[j]) {
0 голосов
/ 23 октября 2018

Может быть проще использовать Array.reduce ...

var array = [1,2,3,4,5,6,4,5,66,44,66]

var result = array.reduce((prev,value) => { 
                if ( prev.exists[value] ) { prev.dupes[value] = true; } 
                prev.exists[value] = true; 
                return prev; 
              },{ exists: {}, dupes: {} })
              
var duplicates = Object.keys(result.dupes);

console.log('duplicates',duplicates);

var filterDupes = array.filter(value => result.dupes[value])

console.log('fitlerDupes',filterDupes);

var mapDupes = array.map(value => result.dupes[value] ? value : null)

console.log('mapDupes',mapDupes);

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

console.log('Original Array',array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...