2016-07-22 4 views
1

haben vorausgesetzt, ich habe ein Array von Kursen:Suffle Array durch seine Subarrays, die gleichen Feldwert

Courses: 
    Course: 
     name: 'Bible' 
     grade: 87 
    Course: 
     name: 'Math' 
     grade: 87 
    Course: 
     name: 'Physics' 
     grade: 87 
    Course: 
     name: 'Biology' 
     grade: 10 
    Course: 
     name: 'Geography' 
     grade: 10 
    Course: 
     name: 'Literature' 
     grade: 0 

Ich will die Untergänge mischen, die die gleichen Qualitäten aufweisen.

Zum Beispiel kann ein Ergebnis sein (Ich schreibe nur die cources Namen, sondern müssen die gesamten Felder):

Math, Bible, Physics, Geography, Biology, Literature 

ein weiteres Ergebnis sein kann:

Bible, Math, Physics, Biology, Geography, Literature 

Literatur sein Das Ende, denn es gibt keine andere Klasse, die gleich 0 ist.

Ich habe eine Funktion, die das Array (ohne Rücksicht auf die Noten der Unterkurse):

function shuffle(array) { 
    var currentIndex = array.length, 
     temporaryValue, randomIndex; 

    // While there remain elements to shuffle... 
    while (0 !== currentIndex) { 

     // Pick a remaining element... 
     randomIndex = Math.floor(Math.random() * currentIndex); 
     currentIndex -= 1; 

     // And swap it with the current element. 
     temporaryValue = array[currentIndex]; 
     array[currentIndex] = array[randomIndex]; 
     array[randomIndex] = temporaryValue; 
    } 

    return array; 
} 

Das Array ist:

var courses = []; 

courses.push(new Course('Bible', 87)); 
courses.push(new Course('Math', 87)); 
courses.push(new Course('Physics', 87)); 
courses.push(new Course('Biology', 10)); 
courses.push(new Course('Geography', 10)); 
courses.push(new Course('Literature', 0)); 

function Course(name, grade) { 
    this.name = name; 
    this.grade = grade; 
} 

Dies ist ein jsfiddle die ich geschaffen habe: http://jsfiddle.net/Ht6Ym/3844/

Jede Hilfe sehr geschätzt.

+1

können Sie das Array zeigen, bitte – brk

+0

@ user21813 97, ich habe mein Thema aktualisiert. Vielen Dank! –

+1

Zuerst mischen, dann nach Sorte sortieren. – JJJ

Antwort

1

Sie können die Methode sort() mit Ihren zwei Kriterien verwenden.

Beispiel:

var courses = [{ 
 
     name: 'Bible', 
 
     grade: 87 
 
    },{ 
 
     name: 'Math', 
 
     grade: 87 
 
    },{ 
 
     name: 'Physics', 
 
     grade: 87 
 
    },{ 
 
     name: 'Biology', 
 
     grade: 10 
 
    },{ 
 
     name: 'Geography', 
 
     grade: 10 
 
    },{ 
 
     name: 'Literature', 
 
     grade: 0 
 
    } 
 
    ]; 
 

 
courses.sort(function(a, b) { 
 
    return a.grade < b.grade || (a.grade == b.grade && Math.random() < 0.5) ? 1 : -1; 
 
}); 
 

 
console.log(courses);

+2

Der Callback sollte '-1',' 0' oder '1' zurückgeben, kein Boolean. – deceze

+1

Danke. Das ist behoben. – Arnauld

+0

Danke, es funktioniert! –

1

Verwendung dynamicSort Funktion mit dem Array

function dynamicSort(property) { 
    var sortOrder = 1; 
    if(property[0] === "-") { 
     sortOrder = -1; 
     property = property.substr(1); 
    } 
    return function (a,b) { 
     var result = (a[property] < b[property]) ? -1 : (a[property] > b[property]) ? 1 : 0; 
     return result * sortOrder; 
    } 
} 

console.log(courses.sort(dynamicSort("grade")).reverse()); 

fiddle example

+0

Danke, aber die Sorte gibt die gleichen Ergebnisse zurück: "Physik", "Mathematik", "Bibel", "Geographie", "Biologie", "Literatur". –

Verwandte Themen