Misalkan Anda memiliki objek Javascript seperti {'cat': 'meow', 'dog': 'woof' ...} Apakah ada cara yang lebih ringkas untuk memilih properti acak dari objek daripada cara bertele-tele yang saya buat ini :
function pickRandomProperty(obj) {
var prop, len = 0, randomPos, pos = 0;
for (prop in obj) {
if (obj.hasOwnProperty(prop)) {
len += 1;
}
}
randomPos = Math.floor(Math.random() * len);
for (prop in obj) {
if (obj.hasOwnProperty(prop)) {
if (pos === randomPos) {
return prop;
}
pos += 1;
}
}
}
javascript
random
Bemmu
sumber
sumber
Jawaban:
Jawaban yang dipilih akan bekerja dengan baik. Namun, jawaban ini akan berjalan lebih cepat:
var randomProperty = function (obj) { var keys = Object.keys(obj); return obj[keys[ keys.length * Math.random() << 0]]; };
sumber
Math.random()
Mengembalikan angka dalam kisaran [0,1).Memilih elemen acak dari aliran
function pickRandomProperty(obj) { var result; var count = 0; for (var prop in obj) if (Math.random() < 1/++count) result = prop; return result; }
sumber
Saya rasa tidak ada contoh yang cukup membingungkan, jadi inilah contoh yang sangat sulit dibaca dengan melakukan hal yang sama.
Sunting: Anda mungkin tidak boleh melakukan ini kecuali Anda ingin rekan kerja Anda membenci Anda.
var animals = { 'cat': 'meow', 'dog': 'woof', 'cow': 'moo', 'sheep': 'baaah', 'bird': 'tweet' }; // Random Key console.log(Object.keys(animals)[Math.floor(Math.random()*Object.keys(animals).length)]); // Random Value console.log(animals[Object.keys(animals)[Math.floor(Math.random()*Object.keys(animals).length)]]);
Penjelasan:
// gets an array of keys in the animals object. Object.keys(animals) // This is a number between 0 and the length of the number of keys in the animals object Math.floor(Math.random()*Object.keys(animals).length) // Thus this will return a random key // Object.keys(animals)[0], Object.keys(animals)[1], etc Object.keys(animals)[Math.floor(Math.random()*Object.keys(animals).length)] // Then of course you can use the random key to get a random value // animals['cat'], animals['dog'], animals['cow'], etc animals[Object.keys(animals)[Math.floor(Math.random()*Object.keys(animals).length)]]
Tangan panjang, tidak terlalu membingungkan:
var animalArray = Object.keys(animals); var randomNumber = Math.random(); var animalIndex = Math.floor(randomNumber * animalArray.length); var randomKey = animalArray[animalIndex]; // This will course this will return the value of the randomKey // instead of a fresh random value var randomValue = animals[randomKey];
sumber
Anda bisa membuat array kunci sambil berjalan melalui objek.
var keys = []; for (var prop in obj) { if (obj.hasOwnProperty(prop)) { keys.push(prop); } }
Kemudian, pilih elemen secara acak dari kunci:
return keys[keys.length * Math.random() << 0];
sumber
var keys = Object.keys(obj)
<< 0
ke integer tidak akan melakukan apa-apa.parseInt()
akan melakukan pekerjaan yang sama. Jadi tidak ada yang bisa dipelajari di sini kecuali menulis kode yang kurang bisa dimengerti.Jika Anda mampu menggunakan perpustakaan, Anda mungkin menemukan bahwa perpustakaan JS Lo-Dash memiliki banyak metode yang sangat berguna untuk kasus seperti itu. Dalam hal ini, lanjutkan dan periksa
_.sample()
.(Catatan Konvensi Lo-Dash menamai objek perpustakaan _. Jangan lupa untuk memeriksa penginstalan di halaman yang sama untuk menyiapkannya untuk proyek Anda.)
_.sample([1, 2, 3, 4]); // → 2
Dalam kasus Anda, lanjutkan dan gunakan:
_.sample({ cat: 'meow', dog: 'woof', mouse: 'squeak' }); // → "woof"
sumber
Jika Anda menggunakan underscore.js, Anda dapat melakukan:
_.sample(Object.keys(animals));
Tambahan:
Jika Anda membutuhkan beberapa properti acak, tambahkan nomor:
_.sample(Object.keys(animals), 3);
Jika Anda membutuhkan objek baru dengan hanya properti acak tersebut:
const props = _.sample(Object.keys(animals), 3); const newObject = _.pick(animals, (val, key) => props.indexOf(key) > -1);
sumber
Cara sederhana lainnya untuk melakukan ini adalah dengan mendefinisikan fungsi yang menerapkan
Math.random()
fungsi.Fungsi ini mengembalikan integer acak yang berkisar dari 'min'
function getRandomArbitrary(min, max) { return Math.floor(Math.random() * (max - min) + min); }
Kemudian, ekstrak 'kunci' atau 'nilai' atau 'keduanya' dari objek Javascript setiap kali Anda memberikan fungsi di atas sebagai parameter.
var randNum = getRandomArbitrary(0, 7); var index = randNum; return Object.key(index); // Returns a random key return Object.values(index); //Returns the corresponding value.
sumber
getRandomArbitrary
akan menghasilkan nomor acak baru setiap kali dipanggil.Dalam objek JSON Anda harus menempatkan ini:
var object={ "Random": function() { var result; var count = 0; for (var prop in this){ if (Math.random() < 1 / ++count&&prop!="Random"){ result = this[prop]; } } return result; } }
Fungsi itu akan mengembalikan bagian dalam properti acak.
sumber
Anda dapat menggunakan kode berikut untuk memilih properti acak dari objek JavaScript:
function randomobj(obj) { var objkeys = Object.keys(obj) return objkeys[Math.floor(Math.random() * objkeys.length)] } var example = {foo:"bar",hi:"hello"} var randomval = example[randomobj(example)] // will return to value // do something
sumber