Как реализовать эту 2 функцию в одном? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь создать массив с данными, поступающими из большого массива, который содержит 5 массивов внутри. Проблема в том, что моя функция повторяется 5 раз, так как мне нужно сделать случайную функцию для каждого массива, чтобы получить 2 итерамы от каждого, а затем выполнить конкат, чтобы создать окончательный массив из 10 элементов.

Это большой массив, он имеет еще 3 массива внутри:

var question = [
   CP = [
      { questionNumber: "1", type: "CP", question: "paski?", answer1: "yo", answer2:"javier"},
      { questionNumber: "2", type: "CP", question: "pepino?", answer1: "si", answer2:"no"},
      { questionNumber: "3", type: "CP", question: "cabron?", answer1: "si", answer2:"a veces"},
      { questionNumber: "4", type: "CP", question: "ostia?", answer1: "carne", answer2:"pescado"},
      { questionNumber: "5", type: "CP", question: "adios.", answer1: "dormilon", answer2:"hablador"}
   ],
    NP = [
      { questionNumber: "6", type: "NP", question: "quien es mas wapo?", answer1: "yo", answer2:"javier"},
      { questionNumber: "7", type: "NP", question: "te gusta viajar?", answer1: "si", answer2:"no"},
      { questionNumber: "8", type: "NP", question: "eres romantico?", answer1: "si", answer2:"a veces"},
      { questionNumber: "9", type: "NP", question: "que te gusta mas?", answer1: "carne", answer2:"pescado"},
      { questionNumber: "10", type: "NP", question: "eres mas...", answer1: "dormilon", answer2:"hablador"}
   ]];

и это две функции:

var CPselected = [];
for (var i = 0; i < 2; i++){
    rand();
}
function rand(){
    var ran = CP[Math.floor(Math.random() * CP.length)];  
    if (CPselected.indexOf(ran) == -1)
        CPselected.push(ran);
    else
         rand();
}



var NPselected = [];
for (var i = 0; i < 2; i++){
    NPrand();
}
function NPrand(){
    var ran = NP[Math.floor(Math.random() * NP.length)];  
    if (NPselected.indexOf(ran) == -1)
        NPselected.push(ran);
    else
         NPrand();
}

И, наконец, я согласен:

var Selected = CPselected.concat(NPselected);

Ответы [ 3 ]

1 голос
/ 16 апреля 2019

Чтобы ответить на комментарии, которые вы получили относительно синтаксиса, который вы использовали для объявления question.Обычно в javascript мы определяем объекты следующим образом:

{
  a: [1, 2, 3],
  b: 'hello, world],
}

В вашем вопросе у вас есть что-то похожее на:

[
  a = [1, 2, 3],
  b = 'hello, world',
]

Это создает массив, а не объект, и он работает толькои содержит данные, которые вы хотите, потому что в javascript операция присваивания возвращает правую часть присваивания, например:

a = 'hello, world'

Возвращает «привет, мир».

Что выиметь это допустимый синтаксис, но он очень необычный.


Возвращаясь к вашему актуальному вопросу.

Надеемся, это должно сделать то, что вам нужно.Код объединяет все элементы question в один массив, а затем переносит случайный элемент в новый список, пока в исходном списке не останется элементов.

var question = [
   CP = [
      { questionNumber: "1", type: "CP", question: "paski?", answer1: "yo", answer2:"javier"},
      { questionNumber: "2", type: "CP", question: "pepino?", answer1: "si", answer2:"no"},
      { questionNumber: "3", type: "CP", question: "cabron?", answer1: "si", answer2:"a veces"},
      { questionNumber: "4", type: "CP", question: "ostia?", answer1: "carne", answer2:"pescado"},
      { questionNumber: "5", type: "CP", question: "adios.", answer1: "dormilon", answer2:"hablador"}
   ],
    NP = [
      { questionNumber: "6", type: "NP", question: "quien es mas wapo?", answer1: "yo", answer2:"javier"},
      { questionNumber: "7", type: "NP", question: "te gusta viajar?", answer1: "si", answer2:"no"},
      { questionNumber: "8", type: "NP", question: "eres romantico?", answer1: "si", answer2:"a veces"},
      { questionNumber: "9", type: "NP", question: "que te gusta mas?", answer1: "carne", answer2:"pescado"},
      { questionNumber: "10", type: "NP", question: "eres mas...", answer1: "dormilon", answer2:"hablador"}
   ]];

const getRandomIndex = list => Math.floor(Math.random() * list.length)
const removeArrayItemAtIndex = (list, index) => [
   ...list.slice(0, index),
   ...list.slice(index + 1, list.length),
];

const randomSortTick = (listA, listB) => {
  const indexToTransfer = getRandomIndex(listA);
  return [
     removeArrayItemAtIndex(listA, indexToTransfer),
     [
       ...listB,
       listA[indexToTransfer],
     ],
  ]
}

const transferArrays = (listA, listB, transferFunction) =>
  listA.length > 0 ?
    transferArrays(...transferFunction(listA, listB), transferFunction) :
    [listA, listB]
    
const randomlySortQuestions = questions =>
  transferArrays(
    [...questions[0], ...questions[1]],
    [],
    randomSortTick
  )[1]

console.dir(
  randomlySortQuestions(question)
)
0 голосов
/ 16 апреля 2019

function randomSelect (count, sourceArray, destinationArray) {
  if (destinationArray.length >= count) {
    // the "base case", used to break out of recursion
    return destinationArray;
  }

  var randomIndex = Math.floor(Math.random() * sourceArray.length);
  var item = sourceArray[randomIndex];
  if (destinationArray.indexOf(item) < 0) {
    // call "randomSelect" again with the item added to the destination (recurse)
    return randomSelect(count, sourceArray, destinationArray.concat(item));
  }
  // call "randomSelect" again (recurse)
  return randomSelect(count, sourceArray, destinationArray);
}

console.log(randomSelect(2, [1, 2, 3, 4, 5], []));
console.log(randomSelect(2, ['a', 'b', 'c', 'd', 'e'], []));
Спасибо за подробный ответ, но я думаю, что он не получает то, что я, я напишу весь свой код, чтобы было видно.В массиве 25 элементов в 5 группах.
var question = [
   CP = [
      { questionNumber: "1", type: "CP", question: "paski?", answer1: "yo", answer2:"javier"},
      { questionNumber: "2", type: "CP", question: "pepino?", answer1: "si", answer2:"no"},
      { questionNumber: "3", type: "CP", question: "cabron?", answer1: "si", answer2:"a veces"},
      { questionNumber: "4", type: "CP", question: "ostia?", answer1: "carne", answer2:"pescado"},
      { questionNumber: "5", type: "CP", question: "adios.", answer1: "dormilon", answer2:"hablador"}
   ],
    NP = [
      { questionNumber: "6", type: "NP", question: "quien es mas wapo?", answer1: "yo", answer2:"javier"},
      { questionNumber: "7", type: "NP", question: "te gusta viajar?", answer1: "si", answer2:"no"},
      { questionNumber: "8", type: "NP", question: "eres romantico?", answer1: "si", answer2:"a veces"},
      { questionNumber: "9", type: "NP", question: "que te gusta mas?", answer1: "carne", answer2:"pescado"},
      { questionNumber: "10", type: "NP", question: "eres mas...", answer1: "dormilon", answer2:"hablador"}
   ],
   A = [
      { questionNumber: "11", type: "A", question: "paski?", answer1: "yo", answer2:"javier"},
      { questionNumber: "12", type: "A", question: "pepino?", answer1: "si", answer2:"no"},
      { questionNumber: "13", type: "A", question: "cabron?", answer1: "si", answer2:"a veces"},
      { questionNumber: "14", type: "A", question: "ostia?", answer1: "carne", answer2:"pescado"},
      { questionNumber: "15", type: "A", question: "adios.", answer1: "dormilon", answer2:"hablador"}
   ],
   FC = [
      { questionNumber: "16", type: "FC", question: "paski?", answer1: "yo", answer2:"javier"},
      { questionNumber: "17", type: "FC", question: "pepino?", answer1: "si", answer2:"no"},
      { questionNumber: "18", type: "FC", question: "cabron?", answer1: "si", answer2:"a veces"},
      { questionNumber: "19", type: "FC", question: "ostia?", answer1: "carne", answer2:"pescado"},
      { questionNumber: "20", type: "FC", question: "adios.", answer1: "dormilon", answer2:"hablador"}
   ],
   AC = [
      { questionNumber: "21", type: "AC", question: "paski?", answer1: "yo", answer2:"javier"},
      { questionNumber: "22", type: "AC", question: "pepino?", answer1: "si", answer2:"no"},
      { questionNumber: "23", type: "AC", question: "cabron?", answer1: "si", answer2:"a veces"},
      { questionNumber: "24", type: "AC", question: "ostia?", answer1: "carne", answer2:"pescado"},
      { questionNumber: "25", type: "AC", question: "adios.", answer1: "dormilon", answer2:"hablador"}
   ]
];

, так что здесь у меня есть 5-кратные функции для получения 2 случайных элементов из каждой группы.

var CPselected = [];
for (var i = 0; i < 2; i++){
    rand();
}
function rand(){
    var ran = CP[Math.floor(Math.random() * CP.length)];  
    if (CPselected.indexOf(ran) == -1)
        CPselected.push(ran);
    else
         rand();
}

var NPselected = [];
for (var i = 0; i < 2; i++){
    NPrand();
}
function NPrand(){
    var ran = NP[Math.floor(Math.random() * NP.length)];  
    if (NPselected.indexOf(ran) == -1)
        NPselected.push(ran);
    else
         NPrand();
}

var Aselected = [];
for (var i = 0; i < 2; i++){
    Arand();
}
function Arand(){
    var ran = A[Math.floor(Math.random() * A.length)];  
    if (Aselected.indexOf(ran) == -1)
        Aselected.push(ran);
    else
         Arand();
}

var FCselected = [];
for (var i = 0; i < 2; i++){
    FCrand();
}
function FCrand(){
    var ran = FC[Math.floor(Math.random() * FC.length)];  
    if (FCselected.indexOf(ran) == -1)
        FCselected.push(ran);
    else
         FCrand();
}

var ACselected = [];
for (var i = 0; i < 2; i++){
    ACrand();
}
function ACrand(){
    var ran = AC[Math.floor(Math.random() * AC.length)];  
    if (ACselected.indexOf(ran) == -1)
        ACselected.push(ran);
    else
         ACrand();
}

Здесь я констатирую5 массивов в один


var Selected = CPselected.concat(NPselected, Aselected, FCselected, ACselected);

И здесь я показываю это в html

document.getElementById("data_area").innerHTML = 
"<div id='question_1' class='question_data'><div class='no'>" +CPselected[0].questionNumber+ "</div><div class='type'>" +CPselected[0].type+ "</div><div class='question'>" + CPselected[0].question + "</div><div class='answer_1'>" + CPselected[0].answer1 + "</div><div class='answer_2'>" + CPselected[0].answer2 + "</div></div><div id='question_2' class='question_data'><div class='no'>" +CPselected[1].questionNumber+ "</div><div class='type'>" +CPselected[1].type+ "</div><div class='question'>" + CPselected[1].question + "</div><div class='answer_1'>" + CPselected[1].answer1 + "</div><div class='answer_2'>" + CPselected[1].answer2 + "</div></div>";


0 голосов
/ 16 апреля 2019

Прежде всего, указанный вами массив question не является допустимым синтаксисом JavaScript и поэтому приводит к SyntaxError. РЕДАКТИРОВАТЬ : Это не так , Это работает.

Однако, поскольку ваш вопрос больше касается объединения обеих функций в одну:

Посмотрите на функции, которые у вас уже есть, и определите, что отличает их от других. Для лучшего обзора:

function rand(){
  var ran = CP[Math.floor(Math.random() * CP.length)];  
  if (CPselected.indexOf(ran) == -1)
    CPselected.push(ran);
  else
    rand();
}

// ... Left out for brevity ...

function NPrand(){
  var ran = NP[Math.floor(Math.random() * NP.length)];  
  if (NPselected.indexOf(ran) == -1)
    NPselected.push(ran);
  else
    NPrand();
}

Оба они делают точно так же (вычисляя случайное Number, выберите один элемент из уже существующего Array на основе этого числа и вставьте элемент в новый Array). Они отличаются только , в котором Array используется в качестве «источника» и в качестве «пункта назначения». Это означает, что вы можете легко создать одну функцию из них обоих, передав массивы "source" и "destination" в качестве параметров / аргументов в функцию :

function selectRandom (sourceArray, destinationArray) {
  var randomIndex = Math.floor(Math.random() * sourceArray.length);
  if (destinationArray.indexOf(sourceArray[randomIndex]) < 0) {
    destinationArray.push(sourceArray[randomIndex]);
  } else {
    selectRandom(sourceArray, destinationArray);
  }
}

Это может заменить обе функции, которые у вас есть (rand, а также NPrand). Все, что вам нужно запомнить, это передать правильный исходный и целевой массив.

Мы закончили сейчас? Короче говоря: Нет. Мы можем абстрагировать этот код еще дальше! Давайте посмотрим на две петли :

var CPselected = [];
for (var i = 0; i < 2; i++){
  rand();
}

// ... Left out for brevity ...

var NPselected = [];
for (var i = 0; i < 2; i++){
  NPrand();
}

Угадайте, что: они делают точно так же, как и , поэтому давайте также отвлечемся от них. В сочетании с функцией selectRandom мы получаем:

function randomSelect2 (sourceArray) {
  var destinationArray = [];
  for (var i = 0; i < 2; i += 1) {
    selectRandom(sourceArray, destinationArray);
  }
  return destinationArray;
}

Проверьте это:

function selectRandom (sourceArray, destinationArray) {
  var randomIndex = Math.floor(Math.random() * sourceArray.length);
  if (destinationArray.indexOf(sourceArray[randomIndex]) < 0) {
    destinationArray.push(sourceArray[randomIndex]);
  } else {
    selectRandom(sourceArray, destinationArray);
  }
}

function randomSelect2 (sourceArray) {
  var destinationArray = [];
  for (var i = 0; i < 2; i += 1) {
    selectRandom(sourceArray, destinationArray);
  }
  return destinationArray;
}



console.log(randomSelect2([1, 2, 3, 4, 5, 6]));
console.log(randomSelect2(['a', 'b', 'c', 'd']));

TL; DR

Недостаточно еще? Мы можем объединить то, что у нас есть , в одну функцию . Функция selectRandom уже использует recursion , если случайный элемент из исходного массива уже существует внутри целевого массива, верно? Передав еще один аргумент, который сообщает максимальное количество элементов, которые мы хотим выбрать из исходного массива, мы можем затем написать рекурсивную функцию, которая упаковывает все вещи в одну функцию :

function randomSelect (count, sourceArray, destinationArray) {
  if (destinationArray.length >= count) {
    // the "base case", used to break out of recursion
    return destinationArray;
  }

  var randomIndex = Math.floor(Math.random() * sourceArray.length);
  var item = sourceArray[randomIndex];
  if (destinationArray.indexOf(item) < 0) {
    // call "randomSelect" again with the item added to the destination (recurse)
    return randomSelect(count, sourceArray, destinationArray.concat(item));
  }
  // call "randomSelect" again (recurse)
  return randomSelect(count, sourceArray, destinationArray);
}

console.log(randomSelect(2, [1, 2, 3, 4, 5], []));
console.log(randomSelect(2, ['a', 'b', 'c', 'd', 'e'], []));

Высокий. Однако у него есть серьезный недостаток, который неочевиден: на данный момент эта функция небезопасна для стека , а это означает, что большие числа (первый аргумент) могут уничтожить стек . Чтобы исправить это, вы можете использовать батуты . Однако нет необходимости использовать рекурсивное определение. Если вы хотите пройти по этой кроличьей норе, взгляните здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...