根据键值对 JavaScript 数组进行排序

Sort JavaScript Array based on Key Value

我有一组状态为 'Pass' & 'Fail' 的对象。我想把所有失败的都移到顶部,把所有的都移到底部。有没有数组方法可以做到这一点?

let a = [
  { name: 'x'  , status: 'Pass' },
  { name: 'x1' , status: 'Fail' },
  { name: 'x2' , status: 'Pass' },
  { name: 'x3' , status: 'Fail' }
];

要求的输出是

a = [
  { name: 'x1' , status: 'Fail' },
  { name: 'x3' , status: 'Fail' },
  { name: 'x'  , status: 'Pass' },
  { name: 'x3' , status: 'Pass' }
];
    let failed = []
    let passed = []
       for(let i = 0; i < values.length; i++){ 
         if(values[i].pass){
            passed.push(values[i])
         else {
            failed.push(values[i])
          }
       }
values = []
values.push(...failed)
values.push(...passed)

您可以使用 Array.sort 函数对对象数组进行排序。 代码:

let a = [
      {
        name: "x",
        status: "Pass",
      },
      {
        name: "x1",
        status: "Fail",
      },
      {
        name: "x2",
        status: "Pass",
      },
      {
        name: "x3",
        status: "Fail",
      },
    ];
    a.sort(function (a, b) {
      var keyA = a.status,
        keyB = b.status;
      // Compare the 2 values
      if (keyA < keyB) return -1;
      if (keyA > keyB) return 1;
      return 0;
    });
    console.log(a);

此任务的惯用解决方案:

[...a.filter(el=>el.status==='Fail'),...a.filter(el=>el.status==='Pass')]

不过,我认为@farooq 的解决方案在这里是最好的

这是您可以使用 Array#sortString#localeCompare 方法执行此操作的一种方法。

const a = [ { name: 'x', status: 'Pass' }, { name: 'x1', status: 'Fail' }, { name: 'x2', status: 'Pass' }, { name: 'x3', status: 'Fail' } ],

      output = a.sort(
          ({status:x},{status:y}) => x.localeCompare(y)
      );
      
console.log( output );

您也可以使用 Ascii 值对数组进行排序

a.sort((a, b) => {
  return a.status > b.status ? 1 : a.status < b.status ? -1 : 0;
});

您可以按如下方式使用Array.sort() combined with String.localeCompare()

let a = [
  { name: 'x'  , status: 'Pass' },
  { name: 'x1' , status: 'Fail' },
  { name: 'x2' , status: 'Pass' },
  { name: 'x3' , status: 'Fail' }
];

const result = a.sort((o1, o2) => o1.status.localeCompare(o2.status));

console.log(result)

如果您只是按字典顺序排序,只需使用 localeCompare 和 logical-OR 状态和名称比较值。

let data = [
  { name: 'x'  , status: 'Pass' },
  { name: 'x1' , status: 'Fail' },
  { name: 'x2' , status: 'Pass' },
  { name: 'x3' , status: 'Fail' }
];

const sorted = data.sort(
  ({ name: n1, status: s1 }, { name: n2, status: s2 }) =>
    s1.localeCompare(s2) || n1.localeCompare(n2))

console.log(sorted);
.as-console-wrapper { top: 0; max-height: 100% !important; }

你也可以使用 forEach

let failed = []
let passed = []
values = [
  { name: 'x'  , status: 'Pass' },
  { name: 'x1' , status: 'Fail' },
  { name: 'x2' , status: 'Pass' },
  { name: 'x3' , status: 'Fail' }
]

values.forEach((e) => {
  if (e.status === 'Pass') {
    passed.push(e)
    return
  }
  failed.push(e)
})

values = []
values.push(...failed)
values.push(...passed)

我想用这种方式,使用非常简单的Javascript函数unshiftpush,广泛兼容各种浏览器。

let a = [
  { name: 'x'  , status: 'Pass' },
  { name: 'x1' , status: 'Fail' },
  { name: 'x2' , status: 'Pass' },
  { name: 'x3' , status: 'Fail' }
];

let b = [];
for(var x in a ) {
  if(a[x].status == 'Fail') { b.unshift(a[x]); } else { b.push(a[x]); }
}
console.log(b);