2016-02-24 7 views
0

Первоначально я использовал информацию из предыдущих вопросов, чтобы выяснить, как рандомизировать данные, используя информацию, найденную в переполнении стека Q & A. (How to randomize (shuffle) a JavaScript array?) В моей первоначальной попытке я сделал отдельные рандомизации для имен девочек и имена мальчиков.Рандомизация (перетасовка) массива с объектами в JavaScript

var girls = shuffle([ 
    "Amanda", 
    "Deja", 
    "Grace", 
    "Hailey", 
    "Jada", 
    "Kylie", 
    "Maria", 
    "Shanice", 
    "Victoria" 
]); 

var boys = shuffle([ 
    "Aiden", 
    "Benjamin", 
    "Daniel", 
    "Isaiah", 
    "Jamal", 
    "Maurice", 
    "Steven", 
    "Tyrone", 
    "Zach" 
]); 

рандомизации была завершена с использованием алгоритма Фишера-Yates, представленный @gnarf:

function shuffle(array) { 
    for (var i = array.length - 1; i > 0; i--) { 
     var j = Math.floor(Math.random() * (i + 1)); 
     var temp = array[i]; 
     array[i] = array[j]; 
     array[j] = temp; 
    } 
    return array; 
} 

Как я уже думал об этом, и читать дальше, я понимаю, что мне действительно нужно использовать JSON вместо простой массив. JSON для меня новичок. Я понял, как настроить:

var npc = [{ 
    "npcName": "Amanda", 
    "npcSex": "girl", 
    "npcRisk": "1" 
}, { 
    "npcName": "Deja", 
    "npcSex": "girl", 
    "npcRisk": "2" 
}, { 
    "npcName": "Grace", 
    "npcSex": "girl", 
    "npcRisk": "3" 
}, { 
    "npcName": "Hailey", 
    "npcSex": "girl", 
    "npcRisk": "4" 
}, { 
    "npcName": "Jada", 
    "npcSex": "girl", 
    "npcRisk": "5" 
}, { 
    "npcName": "Kylie", 
    "npcSex": "girl", 
    "npcRisk": "6" 
}, { 
    "npcName": "Maria", 
    "npcSex": "girl", 
    "npcRisk": "7" 
}, { 
    "npcName": "Shanice", 
    "npcSex": "girl", 
    "npcRisk": "8" 
}, { 
    "npcName": "Victoria", 
    "npcSex": "girl", 
    "npcRisk": "9" 
}, { 
    "npcName": "Aiden", 
    "npcSex": "boy", 
    "npcRisk": "1" 
}, { 
    "npcName": "Benjamin", 
    "npcSex": "boy", 
    "npcRisk": "2" 
}, { 
    "npcName": "Daniel", 
    "npcSex": "boy", 
    "npcRisk": "3" 
}, { 
    "npcName": "Isaiah", 
    "npcSex": "boy", 
    "npcRisk": "4" 
}, { 
    "npcName": "Jamal", 
    "npcSex": "boy", 
    "npcRisk": "5" 
}, { 
    "npcName": "Maurice", 
    "npcSex": "boy", 
    "npcRisk": "6" 
}, { 
    "npcName": "Steven", 
    "npcSex": "boy", 
    "npcRisk": "7" 
}, { 
    "npcName": "Tyrone", 
    "npcSex": "boy", 
    "npcRisk": "8" 
}, { 
    "npcName": "Zach", 
    "npcSex": "boy", 
    "npcRisk": "9" 
}]; 

Я не понял, как вызвать функцию правильно или как сделать отдельные randomizations для девочек и мальчиков. Так, например, конец рандомизации должен заменить имена девочек именами других девочек, но сохранить npcRisk в том же порядке. Руководство будет оценено по достоинству.

+4

1) Там нет JSON в вашем вопросе, 2) Вы имеете массив, а не объект, 3) Дубликат http://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array – Teemu

+0

Вы предоставили массив объектов JSON, но никакого фактического кода который демонстрирует, что вы пытались разобрать. Есть довольно буквально десятки учебников о том, как работать и разбирать объекты JSON. Вот старая, но все же полностью соответствующая статья, которая поможет вам начать. Потратьте время на изучение основ работы с объектами JSON, и я готов поспорить, что к концу этой статьи вы выясните ответ на свой вопрос. http://www.copterlabs.com/json-what-it-is-how-it-works-how-to-use-it/ – Korgrue

ответ

0

Я предполагаю, что вы хотите, чтобы npcRisk оставался постоянным и по существу перетасовывал только имена в ваших объектах JSON. Вот простое решение. Он принимает имя и разбивает их на два массива по полу, применяет вашу логику к ним, а затем вставляет новые значения.

function shuffleJSON(input) { 
    var boys = [], 
     girls = []; 
    for (var i = 0; i < input.length; i++) { 
     if (input[i].npcSex === 'boy') { 
      boys.push(input[i].npcName); 
     } 
     if (input[i].npcSex === 'girl') { 
      girls.push(input[i].npcName); 
     } 
    } 

    boys = shuffle(boys); 
    girls = shuffle(girls); 

    for (var i = 0; i < input.length; i++) { 
     if (input[i].npcSex === 'boy') { 
      input[i].npcName = boys.shift(); 
     } 
     if (input[i].npcSex === 'girl') { 
      input[i].npcName = girls.shift(); 
     } 
    } 
    return input; 
} 
0

Почему бы не использовать RNG при создании массива NPC?

Off верхней части моей головы ...

var npcArray = []; 
//Set up name arrays 
var boysNames = ['Matthew', 'Mark', 'Luke' ....]; 
var girlsNames = ['Daisy', 'Helen', 'Beth' ....]; 
for (var i = 1; i <= 9; i++){ 
    var nameIndex = Math.floor(Math.random() * (boysNames.length - 1)); 
    //Create the NPC object using inline notation and add it to the array end of npcArray. N.B. Array.splice() removes an element from the boysName array, hence the use of boysNames.length in the RNG. 
    npcArray.push({ 
     npcName: boysNames.splice(nameIndex, 1), 
     npcSex: 'boy', 
     npcRisk: i 
    }); 
}; 
for (var i = 1; i <= 9; i++){ 
    var nameIndex = Math.floor(Math.random() * (girlsNames.length - 1)); 
    npcArray.push({ 
     npcName: girlsNames.splice(nameIndex, 1), 
     npcSex: 'girl', 
     npcRisk: i 
    }); 
}; 
0

Вы можете попробовать использовать Array.prototype.filter(), Array.prototype.forEach(), setTimeout()

function shuffleProps(arr, prop, term) { 
    var obj = {res:[]}; 

    obj[prop] = arr.filter(function(val, key) { 
     return val[term] === prop 
    }); 

    obj[prop].forEach(function(val, key, arr) { 
    setTimeout(function() { 
     obj["res"].push(val) 
    }, Math.random() * 10) 
    }); 

    return obj["res"] 
} 

var boys = shuffleProps(npc, "boy", "npcSex"); 
Смежные вопросы