2016-07-22 2 views
1

предполагая, у меня есть массив курсов:Суффль массив его подразделы массивов, которые имеют одинаковое значение поля

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 

Я хочу, чтобы перетасовать суб курсы, которые имеют одинаковые ранги.

Например, один результат может быть (я пишу только имена КУРСЫ, но нужны целые поля):

Math, Bible, Physics, Geography, Biology, Literature 

другой результат может быть:

Bible, Math, Physics, Biology, Geography, Literature 

Литература будет конец, потому что нет другого класса, который равен 0.

У меня есть функция, которая наполняет массив (не заботясь о классах вспомогательных курсов):

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; 
} 

Массив:

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; 
} 

Это jsfiddle, что я создал: http://jsfiddle.net/Ht6Ym/3844/

Любая помощь приветствуется.

+1

пожалуйста, вы можете показать массив – brk

+0

@ user21813 97, я обновил свою тему. Благодаря! –

+1

Сначала перетасовать, затем отсортировать по классам. – JJJ

ответ

1

Вы можете использовать метод sort() с двумя вашими критериями.

Пример:

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

Обратный вызов должен возвращать '-1',' 0' или '1', а не логическое. – deceze

+1

Спасибо. Это исправлено. – Arnauld

+0

Спасибо, это работает! –

1

использование dynamicSort функции с массивом

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

Спасибо, но сортировка возвращает те же результаты: «Физика», «Математика», «Библия», «География», «Биология», «Литература». –

Смежные вопросы