有没有一种方法可以随机循环遍历对象的键?

7

我有一个for循环,大致如下:

 for (var key in myObjectArray) {
   [code]
 }

我希望做同样的事情,但每次输出的顺序都不同。 有没有简单的方法可以实现?我可以创建一个键的单独数组,对它们进行排序,然后使用索引进行for循环...但这似乎是很麻烦且相当低效的方法。

https://dev59.com/IXE95IYBdhLWcg3wHqMV - Robert Harvey
它已经有点随机了,因为无法保证对象中的顺序。 - adeneo
3
不能保证百分之百准确,但仍然是确定性的。 - Robert Harvey
相信谷歌浏览器首先根据整数然后按字典顺序对对象进行排序,但不要引用我。 - user1382306
1个回答

10
是的。首先,您需要一个键数组:
var keys;
if( Object.keys) keys = Object.keys(myObjectArray);
else keys = (function(obj) {var k, ret = []; for( k in obj) if( obj.hasOwnProperty(k)) ret.push(k); return ret;})(myObjectArray);
// isn't browser compatibility fun?

接下来,对数组进行随机排序。
keys.sort(function() {return Math.random()-0.5;});
// there are better shuffling algorithms out there. This works, but it's imperfect.

最后,遍历您的数组:
function doSomething(key) {
    console.log(key+": "+myObjectArray[key]);
}
if( keys.forEach) keys.forEach(doSomething);
else (function() {for( var i=0, l=keys.length; i<l; i++) doSomething(keys[i]);})();

好的,谢谢。这基本上就是我已经在做的事情,看起来相当复杂,因为我们知道对数组进行排序有多么容易。 - Dan Goodspeed
如果必须的话,请删除我的“谢谢,我也是”的留言,但我真的很喜欢像这样的天才回答。 - user1382306

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接