javascript - 在 Lodash orderBy 中按转换后的项目排序而不更改它

标签 javascript node.js lodash

我有这样的数据

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"},
];

我想按 COUNT 的数值排序,比如 65, 63, 4451,作为数字而不是字符串。我无法更改数据,因为它以其格式显示在表格中(我将按 5050% 数据进行排序,但显示 50% 等)

基于 Lodash : how to do a case insensitive sorting on a collection using orderBy? ,我将 [item => parseInt(item)] 传递给 orderBy

以下脚本不起作用:

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);

它运行:

$ 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' } ]

这里为什么不按parseInt排序?

最佳答案

您应该告诉 orderBy 按 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>

关于javascript - 在 Lodash orderBy 中按转换后的项目排序而不更改它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45764844/

相关文章:

node.js - Nodejs,mongodb 在插入许多后更新数组

javascript - 有没有lodash函数可以实现这个功能?

javascript - 如何从字符串数组中删除逗号

javascript - 在不重绘背景图的情况下以交互方式向 plotly R 中的子图添加点

javascript - Node.js 中的大型 CSV 到 JSON/对象

javascript - Rails Ajax : Search still refreshing the page after click

ios - Node.js 从 iOS URLSession 主体解析 JSON

node.js - Angular 2导入第三方库

javascript - HTML 模糊 Canvas 图像

lodash - `escape`和 `unescape`的 `underscore`和 `lodash`功能是否相同?