【发布时间】:2019-07-24 06:44:06
【问题描述】:
我有一个名称数组,它们都有重复。
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];
}
});
这应该将Johnindex 2、Jackindex 3 和Juneindex 6 返回到新数组。
但是,这没有奏效。将newArr 记录到控制台将输出一个与原始数组完全一致的数组。
> Array ["John", "Jack", "John", "Jack", "Jack", "June", "June"]
【问题讨论】:
-
那么,基本上是返回不止一次出现的名字?
-
与您声称的相反,过滤器返回的
newArr为空。
标签: javascript arrays string function object