排序以逗号分隔的数字字符串

时间:2019-11-18 22:28:24

标签: javascript sorting underscore.js

我有一些可以采用以下格式的数据,

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

  {
    number: "5"
  },

  {
    number: "3,1"
  },

  {
    number: "3,11"
  },

  {
    number: "3,3"
  },

  {
    number: "3,2"
  }
]

我希望能够按以下优先顺序进行排序... 1.按“数字”值     1.在“ number”中可能的逗号左边的第一个“列”     2.在[number]栏位中,以逗号分隔的右边

因此,我希望看到“ 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”,这很接近但不太正确。关于如何有效解决此问题的任何想法? (我知道我可以在下划线中链接排序)我不喜欢下划线,也可以使用香草JS

1 个答案:

答案 0 :(得分: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);