返回的数组值至少为数组的3倍

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)

有谁知道如何做到这一点?

VLA*_*LAZ 7

您可以.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)


Nin*_*olz 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);
Run Code Online (Sandbox Code Playgroud)