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

时间:2019-06-05 08:16:42

标签: javascript arrays if-statement duplicates

我在做这个时遇到了麻烦,所以我在这里问。 我有一个像这样的数组:

var myArray = ["hi", "hi", "hi", "ha", "ha", "ho", "hu", "hu", "hu"]

我要在新数组中存储至少出现3次的值。所以我应该得到:

var filteredArray = ["hi", "hu"]

有人知道该怎么做吗?

6 个答案:

答案 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(),以获取相同值的数组。
  • 比较该数组的长度和count(第二个参数)

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()