如何使用不同的键对对象数组进行排序

时间:2019-07-04 20:24:55

标签: javascript reactjs

我正在尝试通过特定位置的键对对象数组进行排序。唯一的问题是每个对象都有不同的键名。

这是我要排序的对象的示例:

let data = [
  {name: "James", x: 3, }, 
  {name: "Thomas", y: 1}, 
  {name: "Zack", z: 2}
];

我正在尝试按第二个键对其进行排序,因此顺序应为

    [
      {name: "James", x: 3, }, 
      {name: "Zack", z: 2},
      {name: "Thomas", y: 1} 
    ];

这是我要尝试的方法:

let data = [
      {name: "James", x: 3, }, 
      {name: "Thomas", y: 1}, 
      {name: "Zack", z: 2}
    ];

data.sort((a, b) => {
  let key1 = Object.keys(a)[1];
  let key2 = Object.keys(b)[1];
  return a[key1] > b[key2]
  });
console.log(data)

这是我的jsbin

https://jsbin.com/lihefodoni/edit?html,js,console

不确定为什么它不起作用。我正在尝试在我的react Application中执行此操作,所以我不知道是否需要做其他事情?

2 个答案:

答案 0 :(得分:6)

.sort回调期望 number 作为返回值,而不是布尔值(<运算符将得出)。而是返回数值差:

let data = [
      {name: "James", x: 3, }, 
      {name: "Thomas", y: 1}, 
      {name: "Zack", z: 2}
    ];

data.sort((a, b) => {
  let key1 = Object.keys(a)[1];
  let key2 = Object.keys(b)[1];
  return b[key2] - a[key1]
});
console.log(data)

要使排序更可靠,请.find密钥不是name的条目:

let data = [
      {name: "James", x: 3, }, 
      {name: "Thomas", y: 1}, 
      {name: "Zack", z: 2}
    ];

data.sort((a, b) => {
  const aEntry = Object.entries(a).find(([key]) => key !== 'name');
  const bEntry = Object.entries(b).find(([key]) => key !== 'name');
  return bEntry[1] - aEntry[1];
});
console.log(data)

答案 1 :(得分:1)

您可以排除不需要的键并获取对象的值。它可以通过获取唯一没有索引的项目来工作。

let data = [{ name: "James", x: 3 }, { name: "Thomas", y: 1 }, { name: "Zack", z: 2 }];

data.sort(({ name, ...a }, { name: _, ...b }) => Object.values(b) - Object.values(a));

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