我在做这个时遇到了麻烦,所以我在这里问。 我有一个像这样的数组:
var myArray = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"]
我要在新数组中存储至少出现3次的值。所以我应该得到:
var filteredArray = ["hi", "hu"]
有人知道该怎么做吗?
答案 0 :(得分:7)
您可以使用optional second parameter来执行export class MyClass extends org.library.AbstractClass {
static constructorCalled: boolean = false;
constructor() {
super();
MyClass.constructorCalled = true;
return global.__native(this);
}
}
,而无需使用其他变量,该变量分配了回调的.filter
上下文。因此,您可以利用它来记录所有遇到的事情,并且只允许计数为3的项目。
this
对于更简洁的实现,您可以使用@georg建议的实现
var myArray = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"]
var filteredArray = myArray.filter(item => {
//check what the count so far is
var count = this[item] ? this[item] : 0;
//add one and assign it back as the new count
this[item] = ++count;
//only return the item if the count is 3
return count === 3;
}, {})
console.log(filteredArray)
答案 1 :(得分:5)
您可以获取哈希表并计算发生的次数。然后过滤计数是否为三。
此方法适用于单个循环: O(n)
var array = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"],
hash = {},
result = array.filter(v => (hash[v] = (hash[v] || 0) + 1) === 3);
console.log(result);
答案 2 :(得分:2)
您可以按照以下步骤进行操作:
Set
filter()
。在filter()
内部,对原始数组(具有重复值)使用filter()
,以获取相同值的数组。
var myArray = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"];
const valWhichRepeat = (arr,count) =>
[...new Set(arr)].filter(x =>
arr.filter(a => a === x).length >= count
);
console.log(valWhichRepeat(myArray,3))
上面的代码没有线性的时间复杂度。如果您想要线性时间复杂性,可以使用reduce()
来构建具有元素数量的对象,然后在其键上使用filter()
。
var myArray = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"];
const valWhichRepeat = (arr,count) => {
const obj = arr.reduce((ac,a) => (ac[a] = ac[a] + 1 || 1,ac),{});
return Object.keys(obj).filter(x => obj[x] >= count);
}
console.log(valWhichRepeat(myArray,3))
上面仍然使用两个循环。如果您只想使用一个循环,则可以push()
内的元素reduce()
var myArray = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"];
const valWhichRepeat = (arr,count) =>
arr.reduce(([obj,res],a) => {
obj[a] = obj[a] + 1 || 1;
if(obj[a] === count) res.push(a);
return [obj,res]
},[{},[]])[1]
console.log(valWhichRepeat(myArray,3))
答案 3 :(得分:2)
Object.entries(myArray.reduce((res, cur) => {
res[cur] = (res[cur] || 0) + 1
return res
}, {})).filter(([k, v]) => v >= 3).map(([k, v]) => k)
答案 4 :(得分:1)
var myArray = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"]
var temp = {}
var filteredArray = []
for(let i = 0;i < myArray.length;i++){
if(temp[myArray[i]]){
temp[myArray[i]] += 1
}else{
temp[myArray[i]] = 1
}
}
for(let key in temp){
if(temp[key] >= 3){
filteredArray.push(key)
}
}
console.log(filteredArray);
答案 5 :(得分:1)
function count() {
array_elements = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"];
var filteredArray = [];
var current = null;
var cnt = 0;
for (var i = 0; i < array_elements.length; i++) {
if (array_elements[i] != current) {
if (cnt >= 3) {
filteredArray.push(current);
}
current = array_elements[i];
cnt = 1;
} else {
cnt++;
}
}
if (cnt >= 3) {
filteredArray.push(current);
}
document.write(filteredArray);
}
count()