【问题标题】:Sorting comma-separated strings of number对逗号分隔的数字字符串进行排序
【发布时间】:2020-03-14 08:52:16
【问题描述】:

我有一些数据可以是以下格式,

 let items = [
  {
    number: "1"
  },

  {
    number: "5"
  },

  {
    number: "3,1"
  },

  {
    number: "3,11"
  },

  {
    number: "3,3"
  },

  {
    number: "3,2"
  }
]

我希望能够按以下优先级对其进行排序... 1.按“数字”值 1. 在“数字”中可能的逗号左侧的第一个“列” 2. 通过“数字”字段中可能的逗号右侧的任何内容

因此,我希望看到“1”、“3,1”、“3,2”、“3,3”、“3,11”、“5”

我正在使用下划线进行排序并提出以下内容。

items = _.sortBy(items, function(item) {
  let sort = item.number;

  if (item.number.indexOf(",") != -1) {
    const split = item.number.split(",");
    sort = parseInt(split[0]);
  }

  return sort;
});

items = _.sortBy(items, function(item) {
  let sort = item.number;

  if (item.number.indexOf(",") != -1) {
    const split = item.number.split(",");
    sort = parseInt(split[1]);
  }

  return sort;
});

console.log(items);

这给了我 "1" , "3,1", "3,2", "3,3", "5", "3,11" 接近但不完全正确。关于如何有效解决这个问题的任何想法? (我知道我可以用下划线链接排序)我不偏爱下划线,也可以使用 vanilla JS

【问题讨论】:

  • 确认。错字。刚刚修复了这个,但实际结果在“5”之后有“3,11”

标签: javascript sorting underscore.js


【解决方案1】:

您可以选择 localeCompare 和选项

let items = [{ number: "1" }, { number: "5" }, { number: "3,1" }, { number: "3,11" }, { number: "3,3" }, { number: "3,2" }];

items.sort(function (a,b) {
    return a.number.localeCompare(b.number, undefined, { numeric: true, sensitivity: 'base' });
});

console.log(items);

或取拆分值的增量。

let items = [{ number: "1" }, { number: "5" }, { number: "3,1" }, { number: "3,11" }, { number: "3,3" }, { number: "3,2" }];

items.sort(function (a,b) {
    var aa = a.number.split(','),
        bb = b.number.split(',');
    return aa[0] - bb[0] || (aa[1] || -Infinity) - (bb[1] || -Infinity);
});

console.log(items);

【讨论】:

  • @MaartenBodewes 你的完美答案在哪里?
  • localeCompare 是我正在寻找的。没想到它会像逗号一样。谢谢!实际上,我最初是先按另一个字段对这些项目进行排序(在尝试应用 localeCompare 排序之前)。我现在看到 localeCompare 覆盖了原始排序(来自 Mongo 查询)。有什么简单的方法可以根据您的答案链接排序,还是我只需要一个接一个地排序?
  • 您需要在单个排序回调中进行链接。
猜你喜欢
  • 2017-07-17
  • 1970-01-01
  • 2021-12-06
  • 2022-11-03
  • 2016-01-18
  • 2022-01-01
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多