遍历并获取数组中所有元素的频率

时间:2020-02-13 15:54:22

标签: javascript

我正在遍历[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类型的数字,我想将它们视为对象中的单独键,因为我必须考虑它们的类型分别计算其频率

4 个答案:

答案 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)

enter image description here