JavaScript: создайте функцию, которая возвращает частотное распределение массива - PullRequest
0 голосов
/ 30 июня 2019

Я пытаюсь создать функцию, которая возвращает распределение частот массива.Эта функция должна возвращать объект, где ключи являются уникальными элементами, а значения - частотой, с которой эти элементы встречаются.

Мой код ниже:

function getFrequencies(arr) {

  let obj = {}; 

  for (let i=0; i<arr.length; i++){
    let element = arr[i]; 

    console.log(element)

    // check if key exists in object already

    // if it exists, add 1 to the value
    if (obj[element] !== undefined){
      obj[element] += 1;
    }

    // if it does not exist, add 1 to setup future elements
    else {
      obj[element] === 1; 
    }
  }
  return obj
}

getFrequencies (["A "," B "," A "," A "," A "])

Мой код возвращает: {} когда он должен вернуться:

{ A: 4, B: 1 }

Что я делаюнеправильно?

Ответы [ 3 ]

1 голос
/ 30 июня 2019

obj[element] === 1; это оператор сравнения, а не присвоение.

Вы хотите obj[element] = 1;

Вы можете сделать это проще в ES6 +, чего стоит:

arr.reduce((acc, item) => {
  acc[item] = (acc[item] || 0) + 1
  return acc
}, {})
1 голос
/ 30 июня 2019

Ваша другая часть имеет равенство вместо присваивания

obj[element] === 1;

оно должно быть

obj[element] = 1;

, поэтому ваш код фактически никогда не инициализирует какой-либо ключ на obj

function getFrequencies(arr) {
  let obj = {};
  for (let i = 0; i < arr.length; i++) {
    let element = arr[i];
    if (obj[element] !== undefined) {
      obj[element] += 1;
      console.log(obj, 'in if')
    }
    else {
      obj[element] === 1;
      console.log(obj, 'in else')
    }
  }
  return obj
}

console.log(getFrequencies(["A", "B", "A", "A", "A"]));

Вы можете просто использовать reduce

function getFrequencies(arr) {
  return arr.reduce((op, inp) => {
    op[inp] = op[inp] || 0
    op[inp]++
    return op
  },{})
}

console.log(getFrequencies(["A", "B", "A", "A", "A"]));
0 голосов
/ 30 июня 2019

В вашем блоке else вы используете строгое сравнение, когда оно должно быть просто назначением, то есть:

obj[element] = 1; 

и , а не :

obj[element] === 1;

См. Рабочий пример ниже:

function getFrequencies(arr) {

  let obj = {}; 

  for (let i=0; i<arr.length; i++){
    let element = arr[i]; 

    console.log(element)

    // check if key exists in object already

    // if it exists, add 1 to the value
    if (obj[element] !== undefined){
      obj[element] += 1;
    }

    // if it does not exist, add 1 to setup future elements
    else {
      obj[element] = 1; 
    }
  }
  return obj
}

console.log(getFrequencies(["A", "B", "A", "A", "A"]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...