如何获得数组的索引?

时间:2019-06-05 18:00:25

标签: javascript

我正在尝试获取数组的indexOf,但是在警报中我不断得出-1的结果。谁能告诉我我在这里做错了什么?

我已经使用nextcubetypearray尝试将nextcubetype作为数组使用,结果相同。

<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>

<body>
  <div class="cube Dirt1"></div>
  <div class="cube Dirt2"></div>
  <div class="cube Dirt3"></div>

  <script>
    var Dirt1 = new Object();
    Dirt1.Name = 'Dirt1';
    Dirt1.Level = '1';

    var Dirt2 = new Object();
    Dirt2.Name = 'Dirt2';
    Dirt2.Level = '1';

    var Dirt3 = new Object();
    Dirt3.Name = 'Dirt3';
    Dirt3.Level = '2';

    var terrain = new Array(Dirt1, Dirt2, Dirt3);

    $(".cube").each(function(index) {
      var thiscubetype = $(this).attr('class').split(' ')[1];
      var nextcubetype = $(this).next().attr('class').split(' ')[1];
      var nextcubetypearray = new Array(nextcubetype);

      var nextcubeindex = terrain.indexOf(nextcubetype);
      alert(nextcubeindex);
    });
    
  </script>
</body>

我需要包含nextcubetype的terrain数组的索引

3 个答案:

答案 0 :(得分:1)

您正在寻找对象数组中的索引,但使用对象属性作为标准。

尝试获取名称数组,然后找到索引,如本例所示:

var nextcubeindex = terrain.map(n => n.Name).indexOf(nextcubetype);

答案 1 :(得分:0)

您需要将类名转换为对象:

var thiscubetype = $(this).attr('class').split(' ')[1];
var nextcubetype = $(this).next().attr('class').split(' ')[1];
var nextcubetypearray = new Array(nextcubetype);
//convert string to the Dirt object
var nextcubetypeObj = nextcubetype == "Dirt1" ? Dirt1 : nextcubetype == "Dirt2" ? Dirt2 : Dirt3;

var nextcubeindex = terrain.indexOf(nextcubetypeObj);

另一种方法是创建一个对象进行映射

var mapping = {
  "Dirt1" : Dirt1,
  "Dirt2" : Dirt2,
  "Dirt3" : Dirt3
}

然后映射[nextcubetype]以获取污垢对象

答案 2 :(得分:0)

indexOf返回数组中元素的索引。 nextcubetype只是一个字符串,而terrain是一个对象数组。因此,您可以使用findIndex

(最后一个元素将失败,因为$(this).next().attr('class')将是未定义的。因此,您需要单独处理它)

var Dirt1 = {
   Name: 'Dirt1',
   Level: '1'
}
var Dirt2 = {
   Name: 'Dirt2',
   Level: '1'
}
var Dirt3 = {
   Name: 'Dirt3',
   Level: '2'
}

var terrain = new Array(Dirt1, Dirt2, Dirt3);

$(".cube").each(function(index) {
  var thiscubetype = $(this).attr('class').split(' ')[1];
  var nextcubetype = $(this).next().attr('class').split(' ')[1];
  var nextcubetypearray = new Array(nextcubetype);

  var nextcubeindex = terrain.findIndex(t => t.Name === nextcubetype);

  alert(nextcubeindex);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="cube Dirt1"></div>
<div class="cube Dirt2"></div>
<div class="cube Dirt3"></div>

此外,您可以使用{}而不是Object构造函数来创建对象文字。