jan*_*jte 2 javascript arrays if-statement duplicates
我在做这个时遇到了麻烦,所以我在这里问。我有一个像这样的数组:
var myArray = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"]
Run Code Online (Sandbox Code Playgroud)
我想要的是将至少出现3次的值存储在新数组中。所以我应该得到:
var filteredArray = ["hi", "hu"]
Run Code Online (Sandbox Code Playgroud)
有谁知道如何做到这一点?
您可以.filter使用可选的第二个参数(无需分配额外的变量)来this完成回调,该参数分配了回调的上下文。因此,您可以利用它来记录遇到的所有事件,并且只允许计数为3的项目。
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)Run Code Online (Sandbox Code Playgroud)
对于更简洁的实现,您可以使用@georg建议的实现
var myArray = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"]
var filteredArray = myArray.filter(item => (this[item] = ++this[item] || 1) === 3, {})
console.log(filteredArray)Run Code Online (Sandbox Code Playgroud)
您可以获取一个哈希表并计算发生的次数。然后过滤计数是否为三。
此方法适用于单个循环: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);Run Code Online (Sandbox Code Playgroud)