2015-10-25 2 views
-1

У меня есть идея о том, как улучшить код, но для этого потребуются массивы, и для этих массивов должен быть определенный порядок сортировки.Javascript: сортировка или сортировка пользовательских массивов на основе шаблона

У меня данный массив: var p = ['skewX', 'translateY', 'scale', 'rotateX'];.

мне эти строки, отсортированные внутри массива по схеме:

0 translate, 1 rotate, 2 skew, 3 scale

или

0 ordered translations, 1 ordered rotations, 2 ordered skews, 3 ordered scales

где

index и string

Вопрос: Можно ли сортировать эти массивы на основе этой модели?

Большое спасибо.

+1

Да. Вы можете написать свою собственную функцию сравнения. См.: [Как определить пользовательскую функцию сортировки в javascript?] (Http://stackoverflow.com/questions/5002848/how-to-define-custom-sort-function-in-javascript) – GolezTrol

+0

Спасибо за предложение, но я не понимаю метод sort(), поскольку я не вижу/не понимаю, как, например, scaleX> rotateX'. Можете ли вы, пожалуйста, подделать для меня эпический ответ? Стоит задача. – thednp

+0

Также ваше предложение не имеет никакого отношения к шаблону. – thednp

ответ

1

Функция обратного вызова не сортирует себя. Просто нужно сравнить любые два элемента, которые передаются ему. Поэтому вам нужно написать логику, которая переводит строки, начинающиеся с «translate», перед строками, начинающимися с «rotate».

// Very simple, rudimentary function to translate a type to number. Improve at will. 
 
function typeIndex(x) { 
 
    if (x.indexOf('translate') > -1) return 0; 
 
    if (x.indexOf('rotate') > -1) return 1; 
 
    if (x.indexOf('skew') > -1) return 2; 
 
    if (x.indexOf('scale') > -1) return 3; 
 
    return 1000; // Unknown 
 
} 
 

 
var p = ['skewX', 'rotateY', 'rotateZ', 'translateY', 'scale', 'rotateX', 'ordered skewing']; 
 

 

 
// Sort array using callback; 
 
p.sort(function(a, b){ 
 
    // First compare the difference based on type. 
 
    var result = typeIndex(a) - typeIndex(b); 
 
    
 
    // If the difference is 0, they are of the same type. Compare the whole string. 
 
    if (result == 0) 
 
    result = a.localeCompare(b); 
 
    
 
    return result; 
 
}); 
 

 
console.log(p);

+0

Спасибо, человек, я отдам его, но я думаю, что другой ответ здесь намного лучше :) – thednp

+0

Если вы так думаете, то, пожалуйста, примите это, но я думаю, что это менее читаемо с этой строкой аббревиатур и менее гибкой слишком. Вы должны были бы полностью переписать его, если хотите добавить «транспонировать» в список, например. Кроме того, моя версия выполняет вторичную сортировку по алфавиту, если первая часть такая же. Но это общая ошибка начинающих, чтобы думать, что меньше кода всегда лучше. ;-) – GolezTrol

+0

Я думаю, что вы тот, кто ниспровергнут.Все в порядке, я отвечу на ваш ответ, потому что вы также предоставили большую часть информации. Еще раз спасибо. – thednp

1

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

var p = ['skewX', 'translateY', 'scale', 'rotateX']; 
 

 
p.sort(function(a, b) { 
 
    var order = 'transrotaskewscal'; 
 
    return order.indexOf(a.slice(0,4)) - order.indexOf(b.slice(0,4)); 
 
}); 
 

 
document.write(p);

+0

Огромное вам спасибо, мне не нужно его проверять, я вижу, что здесь все замечательно :). Будет ли это работать для чего-то вроде этого? Var p = ['skewX', 'translateY', 'scale', 'rotateX', 'rotateZ'] '? Моя первая догадка заключается в том, что это так, эти фрагменты '0.4', похоже, соответствуют' trans' + 'rota' +' skew' + 'scal', правильно? – thednp

+0

Да, это была идея. Если вам нужно много чего сделать, * indexOf * может быть немного медленнее, чем поиск свойств объекта, поэтому вы можете использовать 'var p = {trans: 0, rota: 1, ...}'. Какими бы ни были костюмы. – RobG

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