Возвращаемые значения массива, которые как минимум 3 раза в массиве - PullRequest
2 голосов
/ 05 июня 2019

У меня проблемы с этим, поэтому я спрашиваю здесь.У меня есть такой массив:

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

Я хочу сохранить значения, которые встречаются как минимум 3 раза в новом массиве.Поэтому я должен получить:

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

Кто-нибудь знает, как это сделать?

Ответы [ 6 ]

7 голосов
/ 05 июня 2019

Вы можете сделать .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)

Для более краткой реализации вы можете использовать вариант, предложенный @ 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)
5 голосов
/ 05 июня 2019

Вы можете взять хеш-таблицу и подсчитать количество событийЗатем отфильтруйте, если количество равно 3.

Этот подход работает с одним циклом: 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 голосов
/ 05 июня 2019
Object.entries(myArray.reduce((res, cur) => {
    res[cur] = (res[cur] || 0) + 1
    return res
}, {})).filter(([k, v]) => v >= 3).map(([k, v]) => k)
2 голосов
/ 05 июня 2019

Это можно сделать, выполнив следующие действия:

  • Создать функцию, которая принимает массив и не реже одного раза повторяет элемент в качестве аргумента.
  • Удалите дубликаты измассив 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))
1 голос
/ 05 июня 2019

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()
1 голос
/ 05 июня 2019

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);
...