2013-02-21 63 views
0

我需要选择&从javascript对象打印5个随机键/值对。目前我遍历这样的对象:从javascript对象打印5个随机键/值对

 $.each(object, function(key, val) { 
       ... 
     }); 

但我怎么能从这个对象打印5个随机键值对?问题是,我不知道这个对象的长度,所以我不能通过计算随机起始位置&从那里取出5对来做到这一点。

+1

我添加一个jQuery标签。如果这不是你的框架,请重新标记。 – 2013-02-21 10:00:29

+0

谢谢,我忘了提及! – 2013-02-21 10:03:01

+0

在迭代的每一步中,您都可以生成一个与对象长度之间的随机数......然后获取该索引值 – Jacob 2013-02-21 10:03:16

回答

2

找到对象中的项目数并不难。你只需要使用Object.keys。这会得到一个包含对象所有键名的数组。

var keys = Object.keys(object), 
    length = keys.length; 

你可能会再想要随机选择项目,或许是这样的:

var i, 
    result = []; 
for (i = 0; i < 5; i++) { 
    result.push(object[keys[Math.floor(Math.random() * length)]]); 
} 
+0

我遇到过'Object.keys 。 '但这不是一个跨浏览器的解决方案。 http://kangax.github.com/es5-compat-table/ – 2013-02-21 10:10:21

+0

@ user01 [你可以很容易地添加它](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/对象/密钥#兼容性)。 – lonesomeday 2013-02-21 10:12:30

+0

@lonesomeday我已经修复了文档以匹配你的链接锚点:) – 2013-02-21 10:20:53

0

Object.keys(object)会给你所有的按键阵列中的对象

var arrayOfAllKeys = Object.keys(object); 
for(var i=0; i<5; i++){ 
    var rnd = Math.floor(Math.random()*arrayOfAllKeys.length); 
    var objKey = arrayofAllKeys[rnd]; 
    alert("key: " + objKey + " value: " + object[objKey]); 
} 

你可以模拟Object.keys(对象):

var arrayOfKeys = []; 
$.each(object, function(key, value){ 
    arrayOfKeys.push(key); 
} 
+0

我遇到过'Object.keys。 '但这不是一个跨浏览器的解决方案。 http://kangax.github.com/es5-compat-table/ – 2013-02-21 10:12:01

+0

@ user01我已经更新了我的答案,以制作一个“服装”object.key()函数。这样你就可以在任何浏览器中获得密钥数组 – 2013-02-21 10:19:18

0

如果对象不是太大,可以将数据复制到一个规则的阵列和将它洗:

function fisherYates(array){ 
    var i=array.length; 
    while(i--){ 
     var j=Math.floor(Math.random() * (i+1)); 
     var tmp=array[i]; 
     array[i]=array[j]; 
     array[j]=tmp; 
    } 
} 

var object = { 
    firstName: "Jim", 
    lastName: "Smith", 
    city: "London", 
    country: "UK", 
    age: 33, 
    height: 170, 
    score: 123, 
    active: true 
} 

var deck = []; 
$.each(object, function(key, val){ 
    var o = {}; 
    o[key] = val; 
    deck.push(o); 
}); 

fisherYates(deck); 

var selection = deck.slice(0, 5); 
console.log(selection);