【问题标题】:What's wrong with this indexOf implementation?这个 indexOf 实现有什么问题?
【发布时间】:2015-05-15 20:16:02
【问题描述】:

我知道当找不到值时我会省略 -1 选项,但是为什么当值在数组中时它不起作用?它应该返回 1,但返回的是 undefined。

function each(collection, callback) {
  if (Array.isArray(collection)) {
    for (var i = 0; i < collection.length; i++) {
      callback(collection[i], i, collection);
    }
  }
  else {
    for (var prop in collection) {
      callback(collection[prop], prop, collection);
    }
  }
}

function indexOf(array, value) {
  each(array, function(e, index) {
    if (e === value) {
      return index; 
    }
  })
}


console.log(indexOf([1, 2, 3, 4, 5], 2)); ---->>> undefined;

【问题讨论】:

  • 为什么要重新发明轮子?最新浏览器支持Array.prototype.indexOf()
  • javascript基础练习
  • 公平地说,如果修复,这将不会与原生 indexOf 做同样的事情:这个版本还允许您发现第一个具有指定值的属性(“索引”)目的。当然,那么您可能会遇到非保证属性迭代顺序的问题。

标签: javascript


【解决方案1】:

您在回调中返回 index 的值,而不是在 indexOf() 函数本身中。

试试这个实现:

function indexOf(array, value) {
   var returnVal = -1;
   each(array, function(e, index) {
        if (e === value) {
            returnVal = index; 
            return false;
        }
    });
    return returnVal;
}

编辑:正如 Barmar 指出的,这将返回元素最后一次出现的索引,要返回第一次出现的索引,您还必须将 each() 更新为:

function each(collection, callback) {
    if (Array.isArray(collection)) {
        for (var i = 0; i < collection.length; i++) {
            if (callback(collection[i], i, collection) === false) break;
        }
    }
    else {
        for (var prop in collection) {
            if (callback(collection[prop], prop, collection) === false) break;
        }
    }
}

【讨论】:

  • 请注意,这将返回元素最后一次出现的值,而不是第一次出现的值,因为each() 不会停止调用回调。
【解决方案2】:
function indexOf(array, value) {
  each(array, function(e, index) {
    if (e === value) {
      return index; 
    }
  })
}

这里的返回是从传递给each 的函数返回,而不是从你的indexOf 函数返回。您需要以某种方式在该函数范围之外获取该值以返回。使用您当前的每个实现,您将无法打破循环,因此您必须执行以下操作:

function indexOf(array, value) {
  var result = -1;

  each(array, function(e, index) {
    if (e === value) {
      result = index; 
    }
  })

  return result;
}

http://jsfiddle.net/efzogzxq/

【讨论】:

    【解决方案3】:

    您的 indexOf() 函数没有返回任何内容。如果找到,回调将返回索引,但您没有对该值执行任何操作。你可以这样做:

    for (var i = 0; i < collection.length; i++) {
      var result= callback(collection[i], i, collection);
      if (result) return result;
    }
    

    【讨论】:

      【解决方案4】:

      如果找到该索引,您会想要返回该索引。此外,您需要找到值后退出循环,否则您将使用lastIndexOf 而不是indexOf

      function each(collection, callback) {
          if (Array.isArray(collection)) {
              for (var i = 0; i < collection.length; i++) {
                  if (callback(collection[i], i, collection) === true) {
                      return;
                  }
              }
          }
          else {
              for (var prop in collection) {
                  if (callback(collection[prop], prop, collection) === true) {
                      return;
                  }
              }
          }
      }
      
      function indexOf(array, value) {
          var foundIndex = -1;
      
          each(array, function(e, index) {
              if (e === value) {
                  foundIndex = index;
                  return true;
              }
          });
      
          return foundIndex;
      }
      

      【讨论】:

        【解决方案5】:

        indexOf 函数总是返回 undefined,因为你只是从回调函数返回一个值,而不是 indexOf 函数。

        试试这个:

        function indexOf(array, value) {
            var i;
        
            each(array, function(e, index) {
                if (e === value) {
                    i = index; 
                }
            })
        
           return i;
        }
        

        【讨论】:

          猜你喜欢
          • 2021-10-17
          • 2011-09-28
          • 2011-12-14
          • 2017-08-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-27
          • 2023-03-04
          相关资源
          最近更新 更多