在不使用内置indexOf函数的情况下查找数组元素的索引

时间:2015-05-21 13:46:09

标签: javascript arrays

我对JS很新,并且有一个项目来查找数组元素的索引,而不使用内置的indexOf函数。我试图寻找解决方案,但我得到的只是前面提到的内置函数的例子,我已经知道如何使用它。任何人都可以为我提供一个简单的例子吗? 我的想法是这样的,但请注意我是新手,这是一个我真正想要理解的学术练习:

var index;
var target = 10;
for(var val in collection){
   if(collection[val] === target){
      index = val;
    }
    return index;
}

6 个答案:

答案 0 :(得分:4)

这种尝试几乎是正确的。您似乎已经了解了所需的内容:遍历数组的元素,直到找到匹配项,然后返回该匹配项的索引。

但是,你犯了一些错误。让我们一步一步地进行一些改进。

  • 您的return语句位于循环内部,但位于if之外。如果找到匹配项,您只想return。目前,您总是在循环的第一次迭代后返回!

    function myIndexOf(collection, target) {
        var index;
        for(var val in collection){
           if(collection[val] === target){
              index = val;
              return index;
            }
        }
    }
    
  • 不需要单独的index变量。一旦确定答案正确,您就可以返回val

    function myIndexOf(collection, target) {
        for(var val in collection){
           if(collection[val] === target){
              return val;
            }
        }
    }
    
  • 您应该使用数字for循环循环,而不是for-in循环。 for-in循环不保证具有设置顺序,因此您可能无法始终获得匹配的最低索引。 (另外,for-in可以匹配非数字属性名称,这可能不是您想要的。)

    function myIndexOf(collection, target) {
        for(var val=0; val<collection.length; val++){
           if(collection[val] === target){
              return val;
            }
        }
    }
    
  • 要像indexOf一样行事,如果找不到匹配项,您可以返回-1

    function myIndexOf(collection, target) {
        for(var val=0; val<collection.length; val++){
           if(collection[val] === target){
              return val;
            }
        }
        return -1;
    }
    

答案 1 :(得分:2)

  

注意:for..in不应该用于遍历数组所在的数组   索引顺序很重要。

for..in - JavaScript | MDN

var find_index = function(collection, item) {
   for (var i = 0; i < collection.length; ++i) {
       if (collection[i] === item) {
           return i;
       }
   }
};
find_index([5,4,3,2,1], 5)

答案 2 :(得分:0)

在循环遍历数组时,您应该使用从数组的索引for0的简单Length-1循环。不要使用for...in,因为它可以迭代数组的属性,这些属性不是单元格的实际内容,并且无法保证顺序。您希望找到第一个匹配,以获得与.indexOf相同的行为。所以正确的实现看起来像这样:

function myIndexOf(array, target) {
    for (var i=0; i < array.length; i++) {
        if (array[i] === target) {
            return i;
        }
    }
    // item was not found
    return -1;
}

答案 3 :(得分:0)

您可以使用in语句来迭代数组,假设键是值。这里val将是0,1,2 ......所以你可以退货。

然后,您可以使用if中的return:它将停止该函数并返回正确的值,找到您正在寻找的内容。

===是严格的比较运算符,检查var类型,允许您测试这是您正在寻找的确切值。

如果在循环结束时找不到该值,则可以添加带有其他值的返回值(此处为-1)。

function myIndexOf(array, search) {
    for(var val in array){
       if(array[val] === search){
            return val;
        }
    }
    return -1;
}

var myArray = ['a', 'b', 'c'];
console.log(myIndexOf(myArray, 'c')); //2
console.log(myIndexOf(myArray, 'f')); //-1 <- Not found

答案 4 :(得分:0)

你也可以使用它们。遍历数组,如果value与搜索的值不匹配则返回true,因此每次都继续,否则设置ind并返回false。

var getIndex = function(arr, match){
    var ind = -1;
    arr.every(function(val, index) {
      if (val === match){
          ind = index;
          return false;
      }
      return true;
    });
    return ind;
}

getIndex([1, 2, 3], 2);

答案 5 :(得分:0)

这样可行:

var index = 0;
var target = 'c';
var collection = ['a', 'b', 'c', 'd'];

function findIndex(){
  for(var val in collection) {
    if(collection[val] === target){
    return index;
  }
  index++;
 }
}

findIndex();