2017-02-03 2 views
0

Ниже приведен код, который я использую, чтобы получить общее количество агрегатов для определенного groupby. Сначала я получаю все записи с условием фильтрации, а затем на основе столбца groupby, я получаю счет для каждого отдельного значения этой группы по столбцу.javascript - строка и числовое значение сравнение

allRecords.filter(
    function(r){ 
    return r[groupByCondition.column] == groupByCondition.value; 
    } 
).length; 

Это работает очень хорошо, если groupbyColumn имеет числовое значение. Он не получает общее суммарное количество, когда группа по столбцу имеет символы.

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

+0

Вы могли бы предоставить два примера, один с числовым значением, один без. Я не понимаю, что вы имеете в виду. Благодарю. –

+0

функция фильтра «3» и 3 разные, вам нужно parseInt (val, 10) –

+0

или 'return r [groupByCondition.column] .toString() == groupByCondition.value.toString();' (Они могут не быть integers) – Archer

ответ

0

Использование parseInt/parseFloat для преобразования строк в число

return parseInt(r[groupByCondition.column]) == parseInt(groupByCondition.value); 
+3

Он использует '==', а не '===', поэтому '3' == 3 разрешает true. В свете этого, как ваш ответ может быть решением проблемы? – mvermand

+0

Решение @mvermand использует parseInt, так что теперь оба являются целыми числами –

+1

@mvermand '" 3am "== 3 => false' – Justinas

0

Проблема заключается в том groupByCondition.column и groupByCondition.value ожидать объект, такие как groupByCondition = {"column": "col1", "value": "abc"} но ваши приходит иначе groupByCondition = {"col1": "abc"}.

Вы можете либо изменить groupByCondition объект, чтобы соответствовать, как вы к нему доступ позже:

allRecords = [{"col1": "abc", "col2": "xyz"}, {"col1": "cde", "col2": "zxy"}, {"col1": "1", "col2": "bit"}, {"col1": 1, "col2": "byte"}]; 
 

 
function filterRecords(condition) { 
 
    result = allRecords.filter(
 
    function(r){ 
 
     return r[condition.column] == condition.value; 
 
    } 
 
); 
 
               
 
    console.log('The result of filtering by '+JSON.stringify(condition)+' is'); 
 
    console.log(result); 
 
    return result; 
 
} 
 

 
result = filterRecords({"column": "col1", "value": "abc"}); 
 
result = filterRecords({"column": "col1", "value": "cde"}); 
 
result = filterRecords({"column": "col1", "value": "1"}); 
 
result = filterRecords({"column": "col1", "value": 1});

Или вы можете изменить способ доступа к ней, чтобы соответствовать объект условия:

allRecords = [{"col1": "abc", "col2": "xyz"}, {"col1": "cde", "col2": "zxy"}, {"col1": "1", "col2": "bit"}, {"col1": 1, "col2": "byte"}]; 
 

 
function filterRecords(condition) { 
 
    key = Object.keys(condition)[0]; 
 
    result = allRecords.filter(
 
    function(r){ 
 
     return r[key] == condition[key]; 
 
    } 
 
); 
 
               
 
    console.log('The result of filtering by '+JSON.stringify(condition)+' is'); 
 
    console.log(result); 
 
    return result; 
 
} 
 

 
result = filterRecords({"col1": "abc"}); 
 
result = filterRecords({"col1": "cde"}); 
 
result = filterRecords({"col1": 1}); 
 
result = filterRecords({"col1": "1"});

Оба примера предполагают, что вы отфильтровываете записи на основе значения только одного столбца/атрибута. Если вы хотите отфильтровать их на основе нескольких критериев, вам потребуется дополнительная работа.

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