这是我找到的代码作为这个问题的答案:编写一个JavaScript程序来从数组中删除重复的项目(忽略区分大小写)。
doItBAD()
我知道filter()做了什么,indexOf用于查找元素第一次出现的索引,但我不明白这行:
doItGOOD()
仅将唯一元素引入uniqueArray。
答案 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)
array.filter(function(currentValue,index,arr),thisValue)
在您的示例的.filter
方法中,函数正在迭代每个索引,并使用indexOf
来查找:"第一次出现的索引。"
在迭代期间,索引i
遇到重复的元素,并使用测试来查看此i
是否等于给定数组中当前元素的索引。
来自w3schools:
filter()方法创建一个数组,其中包含所有传递测试的数组元素(作为函数提供)。
您示例中的测试是i == rep.indexOf(elem);
。
当迭代到达索引2
时,元素为a
。但是,元素a
的首次出现位于索引1
。此时,i=2
但rep.indexOf(elem) = 1
。测试返回false
,因为2==1
为false
。
此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
可以接受三个参数。在您的代码中,
elem
是Array arr1
的元素。i
是elem
中arr1
的索引。 arr1
中有一个索引。rep
与Array
相同。只需将arr1
视为rep
。根据[MDN的文章] [1] arr1
方法返回可以在数组中找到给定元素的第一个索引;如果不存在,则返回-1。
现在我们可以尝试了解代码的作用。
indexOf()
的值为elem
,则'a'
将返回rep.indexOf(elem);
。 1
为elem
,索引'a'
elem
为i
,3
将返回return i == rep.indexOf(elem);
,并且当索引false
等于true
时将返回i
。这意味着过滤器将返回一个数组,其中包含数组中每个元素的第一索引中的值。
让我们模拟代码:
1