如何在JavaScript中使用indexOf和filter()

时间:2017-08-05 13:46:46

标签: javascript arrays indexof

这是我找到的代码作为这个问题的答案:编写一个JavaScript程序来从数组中删除重复的项目(忽略区分大小写)。

doItBAD()

我知道filter()做了什么,indexOf用于查找元素第一次出现的索引,但我不明白这行:

doItGOOD()

仅将唯一元素引入uniqueArray。

7 个答案:

答案 0 :(得分:2)

根据MDN关于Array#indexOf的文章:

  

indexOf()方法返回给定元素的第一个索引   可以在数组中找到,如果不存在,则返回-1。

在您提供的代码中:

var uniqueArray = arr1.filter(function(elem,i,rep){
    return i == rep.indexOf(elem);
})

过滤器回调中的变量i是数组中当前项的索引。如果项目的外观不止一个,则当前索引(i)和Array#indexOf返回的索引对于第一个之后的重复值将有所不同。在这种情况下,过滤器回调将返回false,并且将过滤掉重复的值。

答案 1 :(得分:2)

i == rep.indexOf(elem);

将始终返回在数组中找到元素的第一个索引,因此在过滤后的数组中只接受第一个副本。

答案 2 :(得分:0)

返回测试i等于找到的元素的索引,因此函数return将为true或false。

答案 3 :(得分:0)

var uniqueArray = arr1.filter(function(elem,i,rep){
    return i == rep.indexOf(elem);
})

这里elem将包含数组的每个元素,我将是当前elem的索引,rep将包含整个数组
现在 rep.indexOf(elem); 总是给出元素第一次出现的索引现在Array.prototype.filter()的工作方式是,如果你返回true,它就不会过滤它但是如果你返回false,它会过滤掉它,所以除了第一次出现之外的所有元素都被过滤掉了

答案 4 :(得分:0)

来自w3schools

  

array.filter(function(currentValue,index,arr),thisValue)

在您的示例的.filter方法中,函数正在迭代每个索引,并使用indexOf来查找:"第一次出现的索引。"

在迭代期间,索引i遇到重复的元素,并使用测试来查看此i是否等于给定数组中当前元素的索引。

来自w3schools

  

filter()方法创建一个数组,其中包含所有传递测试的数组元素(作为函数提供)。

您示例中的测试是i == rep.indexOf(elem);

当迭代到达索引2时,元素为a。但是,元素a的首次出现位于索引1。此时,i=2rep.indexOf(elem) = 1。测试返回false,因为2==1false

false返回从新创建的数组中排除索引a处的重复元素2

答案 5 :(得分:0)

    public class UnityResolver : IDependencyResolver
    {
    protected IUnityContainer container;

    public UnityResolver(IUnityContainer container)
    {
        if (container == null)
        {
            throw new ArgumentNullException("container");
        }
        this.container = container;
    }

    public object GetService(Type serviceType)
    {
        try
        {
            return container.Resolve(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return null;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return container.ResolveAll(serviceType);
        }
        catch (ResolutionFailedException)
        {
            return new List<object>();
        }
    }

    public IDependencyScope BeginScope()
    {
        var child = container.CreateChildContainer();
        return new UnityResolver(child);
    }

    public void Dispose()
    {
        container.Dispose();
    }
}

答案 6 :(得分:0)

var arr1=[3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3, 'A'];

var uniqueArray = arr1.filter(function(elem,i,rep){
    return i == rep.indexOf(elem);
})
console.log(uniqueArray);

让我尝试解释代码及其结果。

Array.prototype.filter可以接受三个参数。在您的代码中,

  1. elemArray arr1的元素。
  2. ielemarr1的索引。
  3. 它在arr1中有一个索引。
  4. repArray相同。只需将arr1视为rep

根据[MDN的文章] [1] arr1方法返回可以在数组中找到给定元素的第一个索引;如果不存在,则返回-1。

现在我们可以尝试了解代码的作用。

  1. 如果我们假设indexOf()的值为elem,则'a'将返回rep.indexOf(elem);
  2. 假设1elem,索引'a' elemi3将返回return i == rep.indexOf(elem);,并且当索引false等于true时将返回i

这意味着过滤器将返回一个数组,其中包含数组中每个元素第一索引中的值。

让我们模拟代码:

1