【问题标题】:JavaScript IndexOf with heterogeneous array [closed]具有异构数组的 JavaScript IndexOf [关闭]
【发布时间】:2019-09-24 06:09:34
【问题描述】:

javascript indexOf 函数不适用于混合类型的数组。任何其他选择

 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]

【问题讨论】:

  • usedVlans 分配在哪里?
  • 这段代码背后的意图是什么?您正在查找数组的索引作为它的成员。
  • 正在更新问题
  • 随着更新 5 丢失,因为它在数组中找到。再说一遍,这里的意图是什么——我只能说代码在指令方面做了什么,我不清楚给出的指令是否对任务正确。
  • 所以你想要一个数组范围[1,range),不包括来自myArray的数字和数字字符串。这就是你所追求的吗?

标签: javascript arrays indexof


【解决方案1】:

为什么缺少 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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      对于这种用例,例如检查集合中是否存在值,您可以将Set 与数字作为值并再次检查此值是否为一组想要的数字。

      Array#indexOf 进行严格比较,仅当值具有相同标识 (Identity/strict equality operator ===) 时才返回索引。

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

      【讨论】:

        【解决方案4】:

        检查字符串和数字为 [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)

        【讨论】:

          【解决方案5】:

          因为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)

          更多here.

          【讨论】:

            【解决方案6】:

            Array#indexOf 只做严格相等来找到值,所以因为"2" === 2"3" === 3 都是false,那么myArray.indexOf(i) 返回-1i 具有值2 或@ 987654330@.

            如果你想通过一个混合类型的数组只查看一种类型,那么首先让数组只有一种类型可能更容易:

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

            【讨论】:

              【解决方案7】:

              好的,你需要的结果是 [1,4,6,7,8,9]

              那么你必须对 if 条件进行一些更改。 为什么我会让你知道首次运行的代码 sn -p

               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 类型的数据。

              【讨论】:

              • ''+i+'' 没用 - ''+i' 将隐式转换为字符串,添加另一个空字符串无济于事。
              • 是的,我们可以做到!我只是这样写来理解我正在将i int 值转换为字符串。 :)
              • 再次,''+i 进行字符串转换,第二个空字符串完全没用,它不会改变任何东西,甚至不会使其更清晰 - 惯用的隐式转换是空字符串首先是连接,然后是数值:"" + i。如果您想比这更清楚,请使用显式转换:String(i)。使用非惯用构造并不能使正在发生的事情变得更容易理解,反而适得其反。
              猜你喜欢
              • 1970-01-01
              • 2017-03-25
              • 1970-01-01
              • 1970-01-01
              • 2015-04-22
              • 2011-05-17
              • 1970-01-01
              • 1970-01-01
              • 2014-09-16
              相关资源
              最近更新 更多