【问题标题】:How Can I sort and array by values? e.g first 4's than 2's than 16's [duplicate]如何按值排序和排列?例如,前 4 比 2 比 16 [重复]
【发布时间】:2021-04-18 12:30:30
【问题描述】:

我已经试过了

 test.sort(function (a, b) {
    var textA = a[0].Val1;
    var textB = b[0].Val1;
    if (textA > textB)
        return -1;
    if (textA < textB)
        return 1;
    return 0;
});

但我想看到这样的排序数组

{name: 'John', Val1: 4, hireDate: "July 1, 2010"},
{name: 'XXX', Val1: 4, hireDate: "August 15, 2009"},
{name: 'YYY', Val1: 2, hireDate: "August 15, 2009"},
{name: 'ZZZ', Val1: 2, hireDate: "August 15, 2009"},
{name: 'ZZZ', Val1: 16, hireDate: "August 15, 2009"},
{name: 'ZZZ', Val1: 16, hireDate: "August 15, 2009"},
{name: 'Ana', Val1: 1, hireDate: "December 12, 2011"}

【问题讨论】:

  • 这样的顺序背后是否有任何特定的逻辑,或者它应该只是硬编码?
  • 我想,应该是a.Val1而不是a[0].Val1a是数组的一个元素。 b 也是如此。
  • test.sort((a, b) =&gt; a.toString().localeCompare(b))

标签: javascript arrays sorting object key-value


【解决方案1】:

你可以通过创建一个排序对象来做到这一点。

const data = [
  { name: 'John', Val1: 4, hireDate: 'July 1, 2010' },
  { name: 'XXX', Val1: 4, hireDate: 'August 15, 2009' },
  { name: 'YYY', Val1: 2, hireDate: 'August 15, 2009' },
  { name: 'ZZZ', Val1: 2, hireDate: 'August 15, 2009' },
  { name: 'ZZZ', Val1: 16, hireDate: 'August 15, 2009' },
  { name: 'ZZZ', Val1: 16, hireDate: 'August 15, 2009' },
  { name: 'Ana', Val1: 1, hireDate: 'December 12, 2011' },
];

const order = { 4: 1, 2: 2, 16: 3 };
data.sort(
  (x, y) =>
    (order[x.Val1] || Number.MAX_VALUE) - (order[y.Val1] || Number.MAX_VALUE)
);
console.log(data);

【讨论】:

  • OP并没有很好地表达这个问题,他基本上是想按Val1在文本降序排序..
  • 在控制台上运行良好。但它在 .js 文件中不起作用
  • .js file 中不起作用是什么意思?
  • 你的节点版本是多少?
  • 我正在使用 bootstrap v.3 和 Visual Studio 2017
【解决方案2】:

您可以在单独的scores 列表中定义顺序,并使用.indexOf,如下所示:

const test = [
  {name: 'John', Val1: 4, hireDate: "July 1, 2010"},
  {name: 'XXX', Val1: 4, hireDate: "August 15, 2009"},
  {name: 'YYY', Val1: 2, hireDate: "August 15, 2009"},
  {name: 'ZZZ', Val1: 2, hireDate: "August 15, 2009"},
  {name: 'ZZZ', Val1: 16, hireDate: "August 15, 2009"},
  {name: 'ZZZ', Val1: 16, hireDate: "August 15, 2009"},
  {name: 'Ana', Val1: 1, hireDate: "December 12, 2011"}
];
const scores = [4,2,16];
const MAX = scores.length;

const sorted = test.sort((a, b) => {

  let indexOfA = scores.indexOf(a.Val1);
  indexOfA = (indexOfA >= 0) ? indexOfA : MAX;
  
  let indexOfB = scores.indexOf(b.Val1);
  indexOfB = (indexOfB >= 0) ? indexOfB : MAX;
  
  return indexOfA - indexOfB;
});

console.log(sorted);

【讨论】:

  • OP并没有很好地表达这个问题,他基本上是想按Val1的文本降序排序..
猜你喜欢
  • 1970-01-01
  • 2021-10-22
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
相关资源
最近更新 更多