2013-05-02 2 views
3

У меня есть два массива
var skladby=["skladba00", "skladba01", "skladba02", "skladba03"];
var zoznam=["text00", "text01", "text02", "text03"];перетасовать два массива в том порядке, в JavaScript

Я хотел бы рандомизации/перетасовать эти два массива в том порядке, но элементы в массивах на [0] позиция должна остаться их позиции.
т.е.
var skladby=["skladba00", "skladba02", "skladba03", "skladba01"];
var zoznam=["text00", "text02", "text03", "text01"];

ТНХ для ваших ответов.

+0

Можно ли считать недостающие котировки на струнах являются опечатка/паста? –

ответ

2

Чтобы изменить массивы на месте, получить перетасовать заказ первым и добавить новые механизмы до конца существующих массивов.

Затем сплайсируйте из индекса 1 туда, где начинается новое расположение (исходная длина).

Элементы с индексом 0 не влияют.

var skladby= ["skladba00", "skladba01", "skladba02", "skladba03"]; 
var zoznam= ["text00", "text01", "text02", "text03"]; 

var i=0, len= skladby.length, next, order=[]; 
while(i<len)order[i]= ++i; //[1,2,3...] 
order.sort(function(){return Math.random()-.5}); 


for(i= 0; i<len; i++){ 
    next= order[i]; 
    skladby.push(skladby[next]); 
    zoznam.push(zoznam[next]); 
} 
skladby.splice(1, len); 
zoznam.splice(1, len); 

/* возвращаемые значения

skladba00, skladba03, skladba01, skladba02

text00, text03, text01, text02 */

1

Перемешайте в один массив с индексом, а затем использовать этот массив реорганизовать эти два массива

var skladby=["skladba00", "skladba02", "skladba03", "skladba01"]; 
var zoznam=["text00", "text02", "text03", "text01"]; 
var arrayShuff = new Array(); 
for (var i=0;i< skladby.length;i++){ 
arrayShuff.push(i); 
} 

fisherYates(arrayShuff); 
function fisherYates (myArray) { 
    var i = myArray.length, j, tempi, tempj; 
    if (i === 0) return false; 
    while (--i) { 
    j = Math.floor(Math.random() * (i + 1)); 
    tempi = myArray[i]; 
    tempj = myArray[j]; 
    myArray[i] = tempj; 
    myArray[j] = tempi; 
    } 
} 
var temp_skladby = new Array(); 
for (i=0;i < arrayShuff.length;i++){ 
    temp_skladby.push(skladby[arrayShuff[i]]); 
} 
skladby = new Array(); 
skladby = temp_skladby.slice(0); 
temp_skladby = new Array(); 
for (i=0;i < arrayShuff.length;i++){ 
    temp_skladby.push(zoznam[arrayShuff[i]]); 
} 
zoznam = new Array(); 
zoznam = temp_skladby.slice(0); 
console.log(zoznam); 
console.log(skladby); 

See Demo

+0

То, что методы fisherYates относятся к http://sedition.com/perl/javascript-fy.html – Dineshkani

0
function shuffle(o){ 
    for(var j, x, i = o.length; i; 
    j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x); 
    return o; 
}; 

var skladby=["skladba00", "skladba02", "skladba03", "skladba01"]; 
var zoznam=["text00", "text01", "text02", "text03"]; 

// concat the first element with the shuffeld other elements 
var skladbySorted = skladby.slice(0,1).concat(shuffle(skladby.slice(1,skladby.length))); 
var zoznamSorted = zoznam.slice(0,1).concat(shuffle(skladby.slice(1,zoznam.length))); 

console.log(skladbySorted); 
console.log(zoznamSorted); 

Это будет работать для всех размеров вашего входного массива, а не только 4-х элементов

кредит к способу тасования относится к Jeff

1

Найти случайные числа, а затем сделать то же свопы в обоих массивах:

 var skladby = ["skladba00", "skladba01", "skladba02", "skladba03", "skladba04", "skladba05"]; 
     var zoznam = ["text00", "text01", "text02", "text03", "text04", "text05"]; 

     if (skladby.length == zoznam.length) { 
      var arr = []; 
      var length = skladby.length; 
      while (arr.length < length-1) { 
       var randomnumber = Math.ceil(Math.random() * (length - 1)); 
       var found = false; 
       for (var i = 0; i < arr.length; i++) { 
        if (arr[i] == randomnumber) { 
         found = true; 
         break; 
        } 
       } 
       if (!found) 
        arr[arr.length] = randomnumber; 
      } 

      var swapTemp; 
      for (var i = 1; i < length; i++) { 
       swapTemp = skladby[i]; 
       skladby[i] = skladby[arr[i - 1]]; 
       skladby[arr[i - 1]] = swapTemp; 

       swapTemp = zoznam[i]; 
       zoznam[i] = zoznam[arr[i - 1]]; 
       zoznam[arr[i - 1]] = swapTemp; 
      } 
     } 
Смежные вопросы