我有以下小提琴使用测试数据,我正在使用$ .each
查看数据我可以循环没有问题,但我想循环遍历数据,然后随机从中获取3个对象。
任何提示或技巧都会有所帮助:
https://jsfiddle.net/inkedraskal/pah44qv6/
$.each(testData,function(x, blah){
//console.log(blah._id);
//this gets each objects id & picture, but I want to get 3 random objects, and their corresponding data
var activeValue = blah._id,
pictureValue = blah.picture;
var markUp = '';
markUp += activeValue + pictureValue;
console.log(markUp);
});
如下问题,它们必须是唯一的**
答案 0 :(得分:1)
我们可以创建Math.random()
函数,它将使用function getRandomEntry() {
return testData[Math.round(Math.random() * (testData.length - 1))];
}
for (var i=0; i<3; i++) {
var entry = getRandomEntry();
console.log(entry._id, entry.picture);
}
函数返回一个数组元素。我们将创建一个循环,每次迭代时都会随机输入。
var randomEntries = [];
function getRandomEntry() {
return testData[Math.round(Math.random() * (testData.length - 1))];
}
function entryExists(entry) {
return randomEntries.indexOf(entry) > -1;
}
for (var i=0; i<3; i++) {
var entry;
do {
entry = getRandomEntry();
} while(entryExists(entry))
randomEntries.push(entry);
console.log(entry._id, entry.picture);
}
如果您每次都需要一个独特的条目。您可以将随机条目保存在单独的数组中,并检查新的是否为unqiue。
question = raw_input
y = "Blah"
c = "Blahblahb"
y_counter = 0
c_counter = 0
print "Is bacon awesome"
if question() = "Yes":
print y
y_counter = y_counter + 1
else:
print c
c_counter = c_counter + 1
print "Blah"
if question() = "Yes":
print y
y_counter = y_counter + 1
else:
print c
c_counter = c_counter + 1
print "y was used " + str(y_counter) + " times!"
print "c was used " + str(c_counter) + " times!"
答案 1 :(得分:1)
下面的代码段中的函数获取一个数组和一个数字(X)的项目,并返回一个新数组,其中包含原始数组中的X个唯一随机项:
function getRandomItems(arr, items) {
var ret = [];
var indexes = [];
var arr_length = arr.length;
// If we don't have enough items to return - return the original array
if (arr_length < items) {
return arr;
}
while (ret.length < items) {
i = Math.floor(Math.random() * arr_length);
if (indexes.indexOf(i) == -1) {
indexes[indexes.length] = i;
ret[ret.length] = arr[i];
}
}
return ret;
}
arr = ['a', 'b', 'c', 'd', 'e']
console.log(getRandomItems(arr, 2))
如果您希望在代码中的每个Array.prototype
上将该函数用作“本机”函数,也可以将该函数添加到Array
:
Array.prototype.getRandomItems = function(items) {
var ret = [];
var indexes = [];
var arr_length = this.length;
// If we don't have enough items to return - return the original array
if (arr_length < items) {
return this;
}
while (ret.length < items) {
i = Math.floor(Math.random() * arr_length);
if (indexes.indexOf(i) == -1) {
indexes[indexes.length] = i;
ret[ret.length] = this[i];
}
}
return ret;
}
arr1 = ['a', 'b', 'c', 'd', 'e']
arr2 = ['aaa', 'bbb', 'ccc', 'ddd', 'eee']
console.log(arr1.getRandomItems(1))
console.log(arr1.getRandomItems(2))
console.log(arr2.getRandomItems(3))
console.log(arr2.getRandomItems(4))
答案 2 :(得分:0)
您可以使用如下的递归函数。
请注意,此实施可防止结果中的重复
function getRandomObjects(array,selected,needed){
/*
*@param array array The array to pull from
*@param selected array The array of results pulled so far
*@param needed int The number of results we want
*/
var length = array.length;
var num = Math.floor(Math.random() * length) + 1; // get random number in bounds of array
var exists=false; // make sure we didnt already pick this object
$.each(selected,function(i,obj){
if(obj.index==num)exists=true;
})
if(exists) getRandomObjects(array,selected,needed); // get a new one if this was a duplicate
else selected.push(array[num]);
if(selected.length!=needed) return getRandomObjects(array,selected,needed); // get another object if we need more
else return selected; // return the final result set
}
var testData = [
{
"_id": "57e5d1a90c4206b128cd8654",
"index": 0,
"guid": "1f3269fc-0822-4c5a-9c52-8055155b407e",
"isActive": true,
"balance": "$3,026.95",
"picture": "http://placehold.it/32x32"
},
{
"_id": "57e5d1a9a986ccb2f41cf7b9",
"index": 1,
"guid": "a6b726b6-6466-4e48-8697-1c6bd7b1c79e",
"isActive": true,
"balance": "$2,642.74",
"picture": "http://placehold.it/32x32"
},
{
"_id": "57e5d1a9f98f8b2f6880de32",
"index": 2,
"guid": "e7d736cc-19e0-4bcb-8d0a-4d17442d8cee",
"isActive": true,
"balance": "$3,341.64",
"picture": "http://placehold.it/32x32"
},
{
"_id": "57e5d1a9e40ded5b017e45cd",
"index": 3,
"guid": "64230ca8-05c0-4c39-a931-794172475a32",
"isActive": true,
"balance": "$2,196.13",
"picture": "http://placehold.it/32x32"
},
{
"_id": "57e5d1a90cc30be769a06d7c",
"index": 4,
"guid": "d6618b78-753a-4ad0-bc14-3687d0b99196",
"isActive": true,
"balance": "$1,611.62",
"picture": "http://placehold.it/32x32"
},
{
"_id": "57e5d1a92481a43f50607415",
"index": 5,
"guid": "35ec8186-9494-4f89-ab89-bed7f39872c3",
"isActive": true,
"balance": "$3,148.87",
"picture": "http://placehold.it/32x32"
},
{
"_id": "57e5d1a9164f17c558ba7ce1",
"index": 6,
"guid": "244970a0-1ce2-405a-8d69-c7903f9bf5eb",
"isActive": false,
"balance": "$3,758.13",
"picture": "http://placehold.it/32x32"
},
{
"_id": "57e5d1a95afde31c5cf592a8",
"index": 7,
"guid": "aa30c82d-dd2b-420c-8b30-7d66cec8d10b",
"isActive": true,
"balance": "$1,311.40",
"picture": "http://placehold.it/32x32"
}
]
var randomObjects=getRandomObjects(testData,[],3);
console.log(randomObjects);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
答案 3 :(得分:0)
您可以做到
var items = [1, 2, 3, 4, 5];
var newItems = [];
for(var i = 0; i < 3; i++) {
var idx = Math.floor(Math.random() * items.length);
newItems.push(items[idx]);
items.splice(idx, 1);
}
console.log(newItems);