2015-01-12 4 views
0

Я сортирую массив объектов, но что-то в моей оценке не работает должным образом. Любое понимание было бы действительно полезно, я начинаю работать в кругах.js array sort не работает должным образом

temp = [{name: 'M12-20'}, {name: 'M20-25'}]; 

a[field] = "M12-20" 
b[field] = "M20-25" 

temp.sort(function(a, b) { 
    var one = /[MFP]\d{2}/.exec(a[field]) || /[MFP]\d{1}/.exec(a[field]); 
    var two = /[MFP]\d{2}/.exec(b[field]) || /[MFP]\d{1}/.exec(b[field]); 

    return (one[0] > two[0] ? 1 : -1); 
    }); 
+1

Параметр '.exec()' метод возвращает массив ** ** если есть совпадение. (Также непонятно, как вы хотите, чтобы эти вещи были заказаны, это просто числовое значение?) – Pointy

+0

правильно, я делал возврат (один [0]> два [0]? 1: -1; не повезло – atlMapper

+4

Как мы должны отвечать на это, если мы не знаем, что находится в 'temp'? Пожалуйста, покажите нам воспроизводимый пример: http://stackoverflow.com/help/mcve – JLRishe

ответ

2

Я могу только предположить, что вы пытаетесь сделать, это извлечь первое число от каждого из этих значений и сравнить их, но если это так, вы делаете это неправильно. a[0] и b[0] произведут полное согласованное значение, если есть совпадение.

Ваше использование Regex также сложнее, чем должно быть.

Попробуйте это:

var temp = [{name: 'M12-20'}, {name: 'M20-25'}], 
    field = 'name', 
    r = /[MFP](\d\d?)/; 

temp.sort(function(a, b) { 
    var one = r.exec(a[field]) || [,NaN], 
     two = r.exec(b[field]) || [,NaN]; 

    return one[1] - two[1]; 
}); 

FYI (примечание стороны) - Использование return condition ? -1 : -1; в функции сравнения рода почти всегда неправильно. Функция должна возвращать 0, если два значения эквивалентны по порядку. Пренебрежение этим может привести к неправильным результатам, неэффективному поведению, или, если вам действительно не повезло, бесконечному циклу.

+0

Совершенно верно, я пытаясь сравнить числа до тире для каждого значения.Такая черта в строке отбрасывала сравнение. – atlMapper

+1

@atlMapper Это было фактически 'M' в строке, которая отбрасывала сравнение. – JLRishe

+0

Ahh ... I видеть что вы говорите и как ваше решение работает (я думаю). Жадное регулярное выражение, ищущее оба числа, построено либо массив результатов, либо для сравнения представлен пустой массив. Спасибо – atlMapper

-2

Попробуйте это:

var temp=[]; 
temp[1]="Apple"; 
temp[2]="Orange"; 
temp[3]="Banana"; 

temp.sort(function(a, b) { 
    return return (a < b) ? 1 : -1; 
}); 

Из источника: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

if (a is less than b by some ordering criterion) { 
    return -1; 
} 
if (a is greater than b by the ordering criterion) { 
    return 1; 
} 
// a must be equal to b 
return 0; 
+0

В отличие от фрагмента, который вы указали из MDN, ваша функция возвращает '1', если' a' и 'b' равны. Я также не вижу, как этот ответ имеет какое-либо отношение к конкретному вопросу, заданному выше. – JLRishe

+0

Это не меняет того факта, что в вашем ответе неверно. Вторая половина моего ответа выражает возможные возвращаемые значения. Как вы можете согласиться, значения retun будут суть сути вопроса. Вы не ответили правильно. – Skywalker

+1

Вам еще предстоит объяснить, что было неверно в моем ответе. Это неверно, по той же причине, что ваш ответ _is_ неверен.Я думаю, вам нужно работать над вашими навыками чтения, потому что вы оба неправильно поняли то, что я делал, и неправильно поняли точку вопроса OP. Обследователю не нужно было объяснять основы его сортировки. Он уже понял, что очень хорошо. – JLRishe

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