【问题标题】:How object works in javascript [duplicate]对象在javascript中的工作方式[重复]
【发布时间】:2019-08-18 18:56:11
【问题描述】:

我正在研究频率计数器的代码,我在其中计算给定字符串中每个单词的频率。

我正在创建一个对象,并将每个单词作为键,并将其频率作为键值对的值。

function wordCount(str) {
  tempStr = str.toUpperCase() 
  arr1 = tempStr.split(" ") 
  let frequencyConter1 = {} 

  for (let val of arr1) { 
    frequencyConter1[val] =  (frequencyConter1[val] || 0) + 1 
  } 

  for (key in frequencyConter1) { 
    console.log(key, frequencyConter1[key])
  }
} 

wordCount("My name is Xyz 1991 He is Abc Is he allright")
1991 1 
MY 1 
NAME 1
IS 3 
XYZ 1 
HE 2 
ABC 1 
ALLRIGHT 1

为什么 1991 年在输出中排名第一?

应该是在XYZ之后吧?

【问题讨论】:

  • 如果您想保留任意键的顺序,请使用Map。对象键有一些关于它们的顺序的规则,有一个没有指定为 for...in 循环尊重的顺序,总体上不太适合这个任务。

标签: javascript object


【解决方案1】:

JavaScript 中的对象不保留遇到顺序,要保留键的插入顺序,请使用新的 Map 对象:

function wordCount(str) {
  tempStr = str.toUpperCase();
  arr1 = tempStr.split(" "); 
  let frequencyConter1 = new Map();
  for (let val of arr1 ){ 
     frequencyConter1.set(val, ((frequencyConter1.get(val) || 0) + 1) );
  } 
  for( let [key, value] of frequencyConter1){
    console.log(`${key} ${value}`);
  }
} 
wordCount("My name is Xyz 1991 He is Abc Is he allright")

注意:正如@Kaiido 提到的,从 ES2015 开始,在 某些 案例中,对对象的键施加了命令。顺序是整数,如键按升序排列,普通键按插入顺序排列,符号按插入顺序排列,但不适用于所有迭代方法。

【讨论】:

  • 你也可以写for (let [key, value] of map)
  • @Ry- 是的,这样更好。谢谢!
  • “JavaScript 中的对象不保留遇到顺序”,[如果某些键可以被评估为整数](自 ES2015 起)这正是 OP 所感受到的。
  • @Kaiido 我可以在我的答案中添加这个吗?
  • 当然可以!那么实际的规则是首先是整数,按升序排列,然后按插入顺序排列字符串,然后是符号。但并非所有功能都必须遵守这些规则。这是一个很好的答案:stackoverflow.com/a/30919039/3702797
猜你喜欢
  • 2018-10-18
  • 1970-01-01
  • 2017-11-15
  • 2019-08-09
  • 2018-04-01
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多