JavaScript IndexOf с гетерогенным массивом - PullRequest
0 голосов
/ 24 сентября 2019

Функция javascript indexOf не работает с типом массива mix.любые другие альтернативы

 var myArray = ["2","3",5]
    var found = [];
    var range = 10;

    for (var i = 1; i < range; i++){
        if(myArray.indexOf(i) === -1)
        {
              found .push(i);
        }
    }


    console.log(found)

выход: [1, 2, 3, 4, 6, 7, 8, 9]

Ожидаемый результат: [1,4,6, 7, 8, 9]

Ответы [ 7 ]

3 голосов
/ 24 сентября 2019

Почему 5 отсутствует?

console.log(5 === "5")

indexOf(5) не -1, поскольку 5 и "5" - это два разных значения (indexOf использует строгое равенство) MDN indexOf

console.log([5].indexOf(5))
console.log(["5"].indexOf(5))

Как сопоставить 5 или "5"?

Проверка числового и строкового значения.

var myArray = ["2", "3", 5]
var found = [];
var range = 10;

for (var i = 1; i < range; i++) {
  if (myArray.indexOf(i) === -1 && myArray.indexOf(String(i)) === -1) {
    found.push(i);
  }
}

console.log(found)
1 голос
/ 24 сентября 2019

Для этого вида использования, например, для проверки, существует ли значение в коллекции, вы можете взять Set с числами в качестве значений и проверить эти значения снова набором требуемых чисел.

Array#indexOf проводит строгое сравнение и возвращает индекс только в том случае, если значение имеет одинаковую идентичность ( Операция идентификации / строгого равенства ===).

var array = ["2", "3", 5],
    values = new Set(array.map(Number)),
    found = [],
    range = 10,
    v;

for (v = 1; v < range; v++) if (!values.has(v)) found.push(v);

console.log(found);
1 голос
/ 24 сентября 2019

Проверьте строки и числа, так как [5] и ["5"] обрабатываются по-разному, потому что их типы различны.т.е. строка и число

var myArray = ["2", "3", 5]
var found = [];
var range = 10;
for (var i = 1; i < range; i++) {
  if (myArray.indexOf(String(i)) === -1 && myArray.indexOf(i) === -1) {
    found.push(i);
  }
}
console.log(found)
1 голос
/ 24 сентября 2019

 var myArray = ["2","3",5]
 var found = [];
 var range = 10;

var tmpArr = myArray.map(function(elm) { 
  return elm.toString(); 
 });
 
 for (var i = 1; i < range; i++){
    if(tmpArr.indexOf(i.toString()) === -1) {
        found .push(i);
    }
}

console.log(found);
1 голос
/ 24 сентября 2019

Потому что myArray.indexOf(5) это 2, а не -1.

var myArray = ["2","3",5]
var found = [];
var range = 10;

for (var i = 1; i < range; i++){
  console.log(i);
  if(myArray.indexOf(i) === -1){
    found .push(i);
  }
}

console.log(found)

Подробнее здесь .

0 голосов
/ 24 сентября 2019

Array # indexOf выполняет строгое равенство только для поиска значения, так как "2" === 2 и "3" === 3 равны false, тогда myArray.indexOf(i) возвращает -1 для i, имеющегозначение 2 или 3.

Если вы хотите просмотреть массив смешанных типов только для одного типа, то, вероятно, проще сначала создать массив только одного типа:

var myArray = ["2", "3", 5]
var found = [];
var range = 10;

//convery all to numbers
myArray = myArray.map(Number);

for (var i = 1; i < range; i++) {
  if (myArray.indexOf(i) === -1) {
    found.push(i);
  }
}


console.log(found);

В качестве альтернативы, если массив должен оставаться со смешанными типами, вы можете использовать .some для проверки наличия и логики питания, которая не зависит оттипы:

var myArray = ["2", "3", 5]
var found = [];
var range = 10;

for (var i = 1; i < range; i++) {
  //lookup using loose equals
  var inArray = myArray
    .some(item => item == i);
  if (!inArray) {
    found.push(i);
  }
}


console.log(found);
0 голосов
/ 24 сентября 2019

хорошо, так как вам нужен ожидаемый результат как [1,4,6, 7, 8, 9]

, тогда вам нужно внести некоторые изменения в условие if.почему я сообщу вам первый фрагмент кода

 var myArray = ["2","3",5]
    var found = [];
    var range = 10;

  for (var i = 1; i < range; i++){
        if(myArray.indexOf(i) === -1 && myArray.indexOf(String(i)) === -1)
        {
              found.push(i);
        }
    }


    console.log(found)

myArray.indexOf(i) === -1, поскольку вы добавили, почему myArray.indexOf(String(i)) === -1, потому что у вас есть разнородные данные.данные типа int и string.

...