【发布时间】:2016-01-25 21:51:09
【问题描述】:
我遇到这个问题的原因: 我试图解决一个算法问题,我需要返回数组中出现次数最多的数字。像 [5,4,3,2,1,1] 应该返回 1。 而且,当两个数字与最大出现次数同时出现时,第一个出现。像 [5,5,2,2,1] 返回 5 因为 5 首先出现。我使用一个对象来存储每个数字的外观。关键是数字本身。
所以当输入是 [5,5,2,2,1] 我的对象应该是
Object {5: 2, 2: 2, 1: 1} 但实际上我得到了Object {1: 1, 2: 2, 5: 2}
因此,当我使用 for..in 迭代对象时,我得到了 2 而不是 5 返回。所以这就是我问这个问题的原因。
此问题出现在 Chrome 控制台中,我不确定这是否是常见问题: 当我运行以下代码时
var a = {};
a[0]=1;
a[1]=2;
a[2]=3;
a 是:Object {0: 1, 1: 2, 2: 3}
但是当我颠倒分配顺序时:
var a = {};
a[2]=3;
a[1]=2;
a[0]=1;
a 也是:Object {0: 1, 1: 2, 2: 3}
数值属性自动按升序排序。
我尝试为数字属性添加前缀或后缀,例如
var a = {};
a['p'+0]=1;
a['p'+1]=2;
a['p'+2]=3;
console.log(a);//Object {p0: 1, p1: 2, p2: 3}
这保持了财产秩序。这是解决问题的最佳方法吗?有没有办法阻止这种自动排序行为?这只发生在 Chrome V8 JavaScript 引擎中吗?提前谢谢!
【问题讨论】:
-
为什么要使用对象?
-
对象本质上是无序的键值对。他们没有订单,所以不要指望他们会保留订单。您的实际问题是什么?
-
见编辑的家伙。很抱歉造成混乱。
-
@TinyGiant 感谢您的代码。但是如果我想找到最先出现的模式呢?在您的代码中,如果输入是 [5,5,4,3,2,1,1],我怎样才能得到 5 而不是 1?
-
在您的回答中,您告诉在键中使用字符串可以保持顺序不变,但在您的示例中,您只显示了有序分配。您是否也尝试过使用字符串进行无序赋值?
标签: javascript sorting object properties