2016-03-24 29 views
-2

Ne yapmak istiyorum sıralama bu dizi elemanları olan aynı Way Sıralama:Çoklu diziler JavaScript

var SortArr = [1,2,4,6,3,5,7,8,12,11,10,9...etc] 

tüm yol kadar 106 şudur: Bir sıralama dizisi ile

name[]; 
standing[]; 
value[]; 
maxvalue[]; 
id[]; 
repstring[]; 

bu dizilerin uzunluğu.

Bu sıralama dizisi, verileri alfabetik olarak değil, özel bir şekilde yeniden düzenlemek için bir anahtar anlamına gelir.

Bunu verimli bir şekilde yapmanın bir yolu nedir? Yukarıdaki dizileri okuduğum gibi bir nesneyi birleştirmeye çalıştım, bunu yapmak için en iyi yol bu olabilirdi (?) Fakat nasıl olduğunu anlayamıyorum. Javascript ve genel olarak kodlama için çok yeni, böylece herhangi bir işaretçi kabul edilir.

} 
//... 
//this is all within a function called rep() 


//Declare things 
    var name = [ ]; 
    var standing = [ ]; 
    var value = [ ]; 
    var maxvalue = [ ]; 
    var id = [ ]; 

    //For converting repstanding to strings 
    var reputation = new Array ("Hated", "Hostile", "Unfriendly", "Neutral", "Friendly", "Honored", "Revered", "Exalted"); 

    //array holding converted strings for each faction 
    var repstring = [ ]; 

    var count = toon.reputation.length; //this value is 106 

    //Populate arrays 
    for (i = 0; i < count; i++) 
    { 
    name[i] = toon.reputation[i].name; //string 
    standing[i] = toon.reputation[i].standing; //number from 0-7 
    value[i] = toon.reputation[i].value; // number from 0-21000 
    maxvalue[i] = toon.reputation[i].max; //number from 3000-21000 
    id[i] = toon.reputation[i].id //number from 1-1741 
    } 

    //Convert standing numbers to reputation string 
    for (i=0; i < count; i++) 
    { 
    repstring[i] = reputation[standing[i]]; 
    } 

    //Create output array 
    var repInfo = new Array(
    name, standing, repstring, value, maxvalue, id, SortArr 
) 

    //Output array 
return repInfo; 
} 

DÜZENLEME: Bu zaman fonksiyonu, örnek çıktısı: (not: sayesinde

Bu, aşağıdaki zaman kodu bu sadece gösterir, her bir dizi için 1-5 değerleri, her biri 106 değer vardır onlar SortArr göre sıralanır böylece şu şekilde görünecektir böylece dizisi)

Name    Standing Repstring Value MaxValue ID  SortArr 
The Black Prince  3  Neutral  2800 3000  1359  5 
The Sons of Hodir  0  Hated  0  36000  1119  3 
Booty Bay    3  Neutral  1875 3000  21   2 
Zandalar Tribe   3  Neutral  0  3000  270   1 
The Oracles    3  Neutral  0  3000  1105  4 

Tamam yani ne ben yapmak istiyorum, bu yeniden düzenlemek geçerli:

Name    Standing Repstring Value MaxValue ID  SortArr 
Zandalar Tribe   3  Neutral  0  3000  270   1 
Booty Bay    3  Neutral  1875 3000  21   2 
The Sons of Hodir  0  Hated  0  36000  1119  3 
The Oracles    3  Neutral  0  3000  1105  4 
The Black Prince  3  Neutral  2800 3000  1359  5 
+0

bazı örnekler ekleyin . –

+0

Ne sorduğunuzu söylemek zor. Giriş dizilerinizi ve çıktı dizilerinizi ve sıralama algoritmasının sözlü bir tanımını gösterin. Günün sonunda, iki nesneyi karşılaştıran ve ilk önce kimin geleceğine karar veren bir işlev yazmanız gerekir. –

+0

Sıralama dizininizde dolaşabilir, değeri çıkartabilirsiniz, sonra üstteki dizilerin her birindeki değerleri bir nesneye çekebilirsiniz. Sonra bunu bir dizide saklayın. Burada yapmaya çalıştığın şey bu mu? Eğer öyleyse, bunu sizin için bir çözüm olarak yazmak kolay olmalıdır. – ManoDestra

cevap

0

, ben yapardım aşağıdaki ...

var SortArr = [1, 2, 4, 6, 3, 5, 7, 8, 12, 11, 10, 9]; 

var collatedArray = []; 
for (var i = 0; i < SortArr.length; i++) { 
    index = SortArr[i]; 
    var collated = { 
     name : name[index], 
     standing : standing[index], 
     value : value[index], 
     maxvalue : maxvalue[index], 
     id : id[index], 
     repstring : repstring[index] 
    } 

    collatedArray.push(collated); 
} 

// Do what you want now with this collated array, 
// which is an array of the objects you require. 
// You can loop through them and access the properties 
// via obj.id, obj.repstanding, etc. 

Ör

function getPlayer(id) { 
    var player = null; 
    for (var i = 0; i < collatedArray.length; i++) { 
     if (collatedArray[i].id == id) { 
      player = collatedArray[i]; 
      break; 
     } 
    } 

    return player; 
} 

Ve sadece nesneleri değişmez olması döndü gerekiyorsa

player.id 
player.repstanding 
// etc... 

, kamu değişkenleri kaldırmak için bu kodu değiştirmek için yeterince basit olurdu ... bundan sonra oyuncu nesnenin özelliklerine erişmek nesneleri ve bunun yerine getter yöntemleri ile erişime izin verin. Bu belirli modelin her bir özelliği için dizileri saklamak yerine, modeliniz ve bir dizi oyuncuyu (veya yukarıda belirtilenler ne olursa olsun) depolamayı düşünmelisiniz.

+0

Bunun için teşekkürler. Bence bu aradığım şey. Onlar gerçekten oyuncu ya da bir seferde belirli bir oyuncu ve bu oyuncu hakkında tüm bilgiler. Her neyse, bu verileri nasıl çıktırabilirim? Eski versiyonumda tüm bilgileri diziler halinde saklıyordum ve RepInfo adında yeni bir dizi yapıp bunu geri verdim. CollatedArray – Ser3nity

+0

döndürmeye çalıştığımda çalışıyor görünmüyor. Tüm bilgileriniz şimdi bu yeni dizide saklanır. Bunun içine girebilir ve döngü dizini üzerinden erişebilirsiniz. Ya da sadece bir oyuncu kimliğiyle eşleşebilirsin, vb. Göstermek için biraz kod ekleyeceğim. – ManoDestra

+0

Teşekkürler, bu mükemmel. Elektronik tablolarımda diziler gibi bir tablo olarak çıktı almak için görünmüyor gibi görünmüyor, ama sadece daha fazla okuma yapmam gerekiyor – Ser3nity

0

Soruyu doğru bir şekilde anlarsam, sıralamak için ilettiğiniz karşılaştırıcı işlevinizdeki SortArray numaranızın dizinini kullanmak istersiniz. Yukarıdaki söyleyerek için ne görünür dayanarak

// indices:    0 1 2 3 4 5 6 
 
// When you see a 1, treat it like 0 (its index in array) in the comparator function 
 
// When you see a 2, treat it like 2 (its index in array)   
 
var desiredSortOrder = [1, 3, 2, 7, 5, 4, 6]; 
 

 
var toSort = [1, 7, 2, 3, 4, 5, 6, 1, 2, 3, 7, 4, 5, 6]; 
 

 
// Map where the key is the number, and the value is the index in the desiredSortOrder array above 
 
var mapToIndex = {}; 
 
desiredSortOrder.forEach((int, index) => mapToIndex[int] = index); 
 

 
toSort.sort((a, b) => mapToIndex[a] - mapToIndex[b]); 
 

 
console.log(toSort); 
 
// [1, 1, 3, 3, 2, 2, 7, 7, 5, 5, 4, 4, 6, 6]

+0

Yapmak istediğim şeyin bu olduğundan emin değilim. Bazı örnekler ekledim belki daha mantıklı. desiredSortOrder doğru geliyor, ama geri kalanını anlamıyorum – Ser3nity

+0

@ Ser3nity Bu, yapmaya çalıştığınız şeyin çekirdeğini oluşturduğundan eminim. Tam bir çözüm yazamayacağım, ancak başka bir soru sormakta özgürsünüz. "Geri kalanını anlamıyorum" bana pek bir şey söylemiyor. –

0

Array#forEach()'u kullanabilir ve yeni dizinlerle yeni bir dizi oluşturabilirsiniz.

var array = ['The Black Prince', 'The Sons of Hodir', 'Booty Bay', 'Zandalar Tribe', 'The Oracles'], 
 
    sortOrder = [5, 3, 2, 1, 4]; 
 

 
function sort(array, sortOrder) { 
 
    var result = []; 
 
    sortOrder.forEach(function (a, i) { 
 
     result[a - 1] = array[i]; 
 
    }); 
 
    return result; 
 
} 
 

 
document.write('<pre>' + JSON.stringify(sort(array, sortOrder), 0, 4) + '</pre>');
Sadece bir ipucu, bu temsilin gibi bir öğeye tüm veri nesneleri toplanır sıralar, size verileri düzenleyebilirsiniz:

[ 
    { 
     "name": "The Black Prince", 
     "standing": 3, 
     "repstring": "Neutral", 
     "value": 2800, 
     "maxValue": 3000, 
     "id": 1359, 
     "sortOrder": 5 
    }, 
    { 
     "name": "The Sons of Hodir", 
     "standing": 0, 
     "repstring": "Hated", 
     "value": 0, 
     "maxValue": 36000, 
     "id": 1119, 
     "sortOrder": 3 
    }, 
    // ... 
]