如何按值排序和排列?例如前 4 比 2 比 16

How Can I sort and array by values? e.g first 4's than 2's than 16's

我试过这个是已知的

 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"}

您可以在单独的 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);

您可以通过创建一个排序对象来完成。

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