我正在遍历[2,2,"2","2",4,4]
的数组,因此在这里计算每个元素的频率,然后将该元素作为对象中的键存储,并将其频率存储为相应键的值。
下面是该代码
let countobjet={},r=[]
for(i=0;i<array.length;i++){
let count=0
for(j=0;j<array.length;j++){
if(array[i]===array[j]){count++
}
}
countobjet[array[i]]=count
}
console.log(countobjet)
现在console.log给出
{2:2,4:2}
我想要的是
{2:2,2:2,4:2}
由于我有两个“ 2”类型的字符串和两个2类型的数字,我想将它们视为对象中的单独键,因为我必须考虑它们的类型分别计算其频率
答案 0 :(得分:3)
您实际上不能对对象执行此操作,因为对象的所有键都是字符串或符号。非字符串或非符号键将被转换为字符串:
const obj = {};
obj["42"] = 1;
obj[42] = 2;
console.log(obj)
如果要保持类型完整,可以使用Map,其键没有此限制:
const array = [2,2,"2","2",4,4];
let countobjet = new Map(),
r = []
for (i = 0; i < array.length; i++) {
let count = 0
for (j = 0; j < array.length; j++) {
if (array[i] === array[j]) {
count++
}
}
countobjet.set(array[i], count)
}
for(let [key, value] of countobjet.entries()) {
console.log(`For key ${key} of type ${typeof key}, count is: ${value}`)
}
console.log(Array.from(countobjet.entries()));
答案 1 :(得分:2)
javascript中的对象键的行为类似于“字符串”。另外,在 对象的两个键不能相同。
这就是您的代码无法正常工作的原因。
用对象字面量来说,b
是一个属性。在JavaScript中,属性可以是字符串,也可以是symbols,尽管在对象文字中定义属性名称时,可以省略字符串定界符。
for (key in a) {
alert(typeof key);
//-> "string"
}
答案 2 :(得分:2)
您应该使用Map而不是对象。对象将键强制转换为字符串。地图可以使用对象或图元。
const frequencies = arr =>
arr.reduce((m, e) => m.set(e, (m.get(e) || 0) + 1), new Map())
const data = [2, 2, '2', '2', 4, 4]
const result = frequencies(data)
console.log(result) // Map { 2 => 2, '2' => 2, 4 => 2 }
如果必须使用对象,则可以执行以下两个示例。
您可以通过组合类型和值来创建密钥:
const key = x => `${typeof x} ${x}`
const frequencies = arr =>
arr.reduce(
(o, e) => ({
...o,
[key(e)]: (o[key(e)] || 0) + 1,
}),
{}
)
const data = [2, 2, '2', '2', 4, 4]
const result = frequencies(data)
console.log(result)
或者,将频率计数嵌套在类型属性中:
const frequencies = arr =>
arr.reduce((o, e) => {
const type = typeof e
o[type] = o[type] || {}
o[type][e] = (o[type][e] || 0) + 1
return o
}, {})
const data = [2, 2, '2', '2', 4, 4]
const result = frequencies(data)
console.log(result)
答案 3 :(得分:1)
由于键为“ 2”,因此对于出现在String和number上的键将被覆盖。
您可以按照以下步骤检查发生的情况
let countobjet = {};
let array = [2, 2, "2", "2", 4, 4];
for (i = 0; i < array.length; i++) {
let count = 0
for (j = 0; j < array.length; j++) {
if (typeof array[i] === 'string' && typeof array[j] === 'string'
&& array[i] === array[j]) {
count++;
} else if (typeof array[i] === 'number' && typeof array[j] === 'number'
&& array[i] === array[j]) {
count++;
}
}
if (typeof array[i] === 'string')
countobjet[array[i] + '_str'] = count;
else
countobjet[array[i]] = count;
}
console.log(countobjet)