2017-08-18 1 views
0

J'ai données commeTrier par poste converti en Lodash orderBy sans changer

let data = [ 
    {DATE: "2017-08-18", COUNT: "65", EVENT_NAME: "TAX_EXEMPTION_FAILURE"}, 
    {DATE: "2017-08-18", COUNT: "63", EVENT_NAME: "FRAUD_NOT_DONE"}, 
    {DATE: "2017-08-18", COUNT: "4451", EVENT_NAME: "FRAUD_ACCEPT"}, 
]; 

Je veux trier par la valeur de nombre de COUNT, comme 65, 63, 4451, sous forme de nombres et non des chaînes. Je ne peux pas changer les données, car il s'affiche dans une table dans le format, il est en (je trier 50% données par 50, mais l'affichage 50%, etc.)

Basé sur Lodash : how to do a case insensitive sorting on a collection using orderBy?, je passe [item => parseInt(item)] à orderBy.

le script suivant ne fonctionne pas:

const _ = require("lodash"); 
const orderBy = require('lodash/orderBy'); 
// import some from 'lodash/some'; 

function isNumber(item) { 
    let isnum = /^\d+$/.test(item); 
    return isnum; 
} 

function are_all_numbers(data, key) { 
    let values = _.map(data, key); 
    return _.every(values, isNumber); 
} 

let data = [ 
    {DATE: "2017-08-18", COUNT: "65", EVENT_NAME: "TAX_EXEMPTION_FAILURE"}, 
    {DATE: "2017-08-18", COUNT: "63", EVENT_NAME: "FRAUD_NOT_DONE"}, 
    {DATE: "2017-08-18", COUNT: "4451", EVENT_NAME: "FRAUD_ACCEPT"}, 
]; 

let order = 'descending'; 

let all_are_numbers = are_all_numbers(data, 'COUNT'); 
console.log('all_are_numbers:'); 
console.log(all_are_numbers); 

if (all_are_numbers) { 
    var orderByResults = orderBy(
     data, 
     [item => parseInt(item)], 
     ['desc'] 
    ); 
} else { 
    var orderByResults = orderBy(
     data, 
     prop, 
     order === 'descending' ? 'desc' : 'asc' 
    ); 
} 

console.log(orderByResults); 

Il fonctionne:

$ node test_script.js 
all_are_numbers: 
true 
[ { DATE: '2017-08-18', 
    COUNT: '65', 
    EVENT_NAME: 'TAX_EXEMPTION_FAILURE' }, 
    { DATE: '2017-08-18', COUNT: '63', EVENT_NAME: 'FRAUD_NOT_DONE' }, 
    { DATE: '2017-08-18', COUNT: '4451', EVENT_NAME: 'FRAUD_ACCEPT' } ] 

Pourquoi est-ce pas le tri par parseInt ici?

Répondre

2

Vous devriez dire orderBy faire la commande par item.COUNT:

[item => parseInt(item.COUNT)], 

orderBy = _.orderBy; 
 

 
function isNumber(item) { 
 
    let isnum = /^\d+$/.test(item); 
 
    return isnum; 
 
} 
 

 
function are_all_numbers(data, key) { 
 
    let values = _.map(data, key); 
 
    return _.every(values, isNumber); 
 
} 
 

 
let data = [ 
 
    {DATE: "2017-08-18", COUNT: "65", EVENT_NAME: "TAX_EXEMPTION_FAILURE"}, 
 
    {DATE: "2017-08-18", COUNT: "63", EVENT_NAME: "FRAUD_NOT_DONE"}, 
 
    {DATE: "2017-08-18", COUNT: "4451", EVENT_NAME: "FRAUD_ACCEPT"}, 
 
]; 
 

 
let order = 'descending'; 
 

 
let all_are_numbers = are_all_numbers(data, 'COUNT'); 
 
console.log('all_are_numbers:'); 
 
console.log(all_are_numbers); 
 

 
if (all_are_numbers) { 
 
    var orderByResults = orderBy(
 
     data, 
 
     [item => parseInt(item.COUNT)], 
 
     ['desc'] 
 
    ); 
 
} else { 
 
    var orderByResults = orderBy(
 
     data, 
 
     prop, 
 
     order === 'descending' ? 'desc' : 'asc' 
 
    ); 
 
} 
 

 
console.log(orderByResults);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>