我有一个包含重复名称的数组。
let arr = ['John', 'Jack', 'John', 'Jack', 'Jack', 'June', 'June'];
我想创建一个新的数组,其中包含一些重复元素,并指定它们出现的实例。
例如,我可能只想让数组包含 John、Jack 和 June 的第二次出现。该数组将如下所示:
'John', 'Jack', 'June'
为实现这个目标,我声明了一个对象
ni
,并循环遍历arr
将属性添加到对象中,每个属性对应于一个名称;该属性将保存一个包含每个名称出现的所有索引的数组。let ni = {};
for(let i = 0; i < arr.length; i++) {
let name = arr[i];
if(nc.hasOwnProperty(name)) {
ni[name].push(i);
} else {
ni[name] = [i];
}
}
console.log(ni);
// > Object { John: Array [0, 2], Jack: Array [1, 3, 4], June: Array [5, 6] }
在我的 Array.filter 函数中,我检查元素的索引是否等于对象属性相同名称的索引 1。
let newArr = arr.filter(function(name) {
if(ni.hasOwnProperty(name)) {
return arr.indexOf(name) === ni[name][1];
}
});
这应该将John
在索引2
,Jack
在索引3
,以及June
在索引6
返回到新数组中。
然而,这并没有起作用。将newArr
记录到控制台将输出一个与原始值完全相同的数组。
> Array ["John", "Jack", "John", "Jack", "Jack", "June", "June"]
newArr
是空的。 - trincot