Я собрал возможное решение, используя underscore.js , чтобы упростить обход объекта и массивов в кросс-браузерной манере:
var data = {
text1: 1,
text2: 2,
text3: 3,
text4: 4,
text5: 5,
text6: 6,
text7: 7,
text8: 8,
text9: 9,
text10: 10
};
function choose(data, num)
{
var keys = _.sortBy(
_.keys(data),
function(k)
{
return (Math.random() * 3) - 1;
}
),
results = [],
k1, k2;
if (num > keys.length) {
throw new Error('Impossible to retrieve more values than exist');
}
while (results.length < num) {
k1 = k2 || keys.pop();
k2 = keys.pop();
results.push({key:k1, value: data[k2]});
}
return results;
}
console.log(choose(data, 5));
Это не обязательно оптимальный подход, нопохоже, соответствует вашим требованиям.Сначала я беру все ключи и сортирую их случайным образом.Затем я перебираю случайные ключи, создавая новый объект с одним ключом и следующим значением ключа.Таким образом, вы всегда будете иметь разные значения, связанные с каждым ключом.Если вам нужно, чтобы оно работало, когда значение num передано в функцию == количество ключей в данных, вам придется добавить немного больше кода - я оставлю это в качестве упражнения для читателя :)
Вы можете сыграть с этим кодом на jsfiddle:
http://jsfiddle.net/zVyQW/1/