JQuery grep фильтрующий массив неправильно только для одного поля - PullRequest
0 голосов
/ 06 июня 2018

Я заполняю таблицу некоторыми json и использую несколько элементов управления, чтобы попытаться отфильтровать таблицу.Пользователь выбирает 1 или все радиостанции, а затем нажимает кнопку фильтра, и таблица обновляется отфильтрованными значениями.Это прекрасно работает для каждой пары ключ / значение в моем json, кроме одной.Мой json выглядит следующим образом:

{
"id": "104",
"part_number": "PCF27340050",
"voltage": "400",
"noise_level": "72",
"rpm": "1420",
},

У меня есть <select> элементы управления для voltage, rpm и noise_level.Они заполняются во время выполнения путем получения различных значений из моего возвращаемого массива json.

Вот как я фильтрую фильтры json:

var selectedVoltage     = ($selectVoltage[0].selectedIndex > 0) ? $selectVoltage.val() : '';
var selectedMaxRPM      = ($selectMaxRPM[0].selectedIndex > 0)  ? $selectMaxRPM.val() : '';
var selectedNoiseLevel  = ($selectNoiseLevel[0].selectedIndex > 0) ? $selectNoiseLevel.val() : '';

var $filtered = $.grep(json,function(fan) {

    (selectedVoltage === ''     || fan.voltage === selectedVoltage) && 
    (selectedMaxRPM === ''      || fan.rpm  <= selectedMaxRPM) && 
    (selectedNoiseLevel === ''  || fan.noise_level <= selectedNoiseLevel);
});

voltage и noise_level точно так, как ожидалось.rpm нет.Я пытаюсь вернуть все, равное или меньше, чем выбранные обороты.Но он фильтрует только пару значений, оставляя записи, которые имеют большее значение, чем выбранные об / мин.Если я изменю <= на ===, он сработает и отфильтрует значение ТОЧНОГО об / мин, но я хочу отфильтровать все less than или equal to <= </p>

Единственное, что я могу вспомнитьэто может быть проблемой, когда я сортирую параметры <select> при заполнении элементов управления select.Я делаю это здесь:

//sort arrays that hold values for <select>
voltageArray.sort();
rpmArray.sort(function(a, b){return a-b}); //this is the only array I have to sort this way, otherwise it won't sort
noiseLevelArray.sort();

//Append array values to <select>
$.each(voltageArray, function(v) {
    $selectVoltage.append('<option value="' + voltageArray[v] + '">' + voltageArray[v] + 'v</option>');
});

$.each(rpmArray, function(r) {
    $selectMaxRPM.append('<option value="' + rpmArray[r] + '">' + rpmArray[r] + ' rpm</option>');
});

$.each(noiseLevelArray, function(n) {
    $selectNoiseLevel.append('<option value="' + noiseLevelArray[n] + '">' + noiseLevelArray[n] + ' dBA</option>');
});

Набирая этот вопрос, я заметил, что если я не использую function(a, b){return a-b} для сортировки массива rpm, это работает!Элементы управления select отсортированы неправильно, но это работает.Это сортируется так: 1100, 1120, 200, 220, 300 (сортировка по первой цифре, а не по возрастанию по значению), если я не использую function(a, b){return a-b}.

Есть ли способ исправить это?Нужно ли сортировать массив rpm по-другому?Использование только функции .sort() само по себе позволяет мне правильно фильтровать эти значения (но мой элемент управления select отсортирован неправильно).Использование .sort(function(a, b){return a-b}) по какой-то причине нарушает мой фильтр для этого поля (но правильно сортирует элемент управления select).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...