我正在尝试创建一个返回数组频率分布的函数。该函数应该返回一个对象,其中键是唯一元素,值是这些元素出现的频率。
我的代码如下:
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 }
我在做什么错?
答案 0 :(得分:1)
obj[element] === 1;
是比较运算符,而不是赋值。
您想要obj[element] = 1;
您可以在ES6 +中更轻松地完成此操作,因为它值得:
arr.reduce((acc, item) => {
acc[item] = (acc[item] || 0) + 1
return acc
}, {})
答案 1 :(得分:1)
您的另一部分是平等而非分配
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"]));
答案 2 :(得分:0)
在您的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"]));