【问题标题】:How would I dynamically sort an array of objects by the key names? - The names differ by numeric characters only如何按键名动态排序对象数组? - 名称仅以数字字符不同
【发布时间】:2021-08-24 04:01:33
【问题描述】:

这是我正在获取的对象数组(源不是我的,所以我无法以任何方式更改此数据服务器端的结构)。

[
  { phase4: 3 },
  { phase3: 4 },
  { phase2: 14 },
  { phase1: 46 },
  { phase6: 12 },
  { phase5: 1 }
]

有没有办法可以将给定的数组动态排序为以下?

[
  { phase1: 46 },
  { phase2: 14 },
  { phase3: 4 },
  { phase4: 3 },
  { phase5: 12 },
  { phase6: 1 },
]

更新

jsfiddle

【问题讨论】:

  • 如果你要投反对票,至少解释一下为什么?过去 1.5 小时我一直在查找它 - 问题不清楚,也没有用处???

标签: javascript node.js arrays sorting javascript-objects


【解决方案1】:

您可以使用自定义排序算法进行排序。你只需要使用Object.keys(obj)[0]获取密钥

const arr = [
  { phase4: 3 },
  { phase3: 4 },
  { phase2: 14 },
  { phase1: 46 },
  { phase6: 12 },
  { phase5: 1 },
];

const result = arr.sort((a, b) => {
  const prop1 = Object.keys(a)[0];
  const prop2 = Object.keys(b)[0];
  
  if (prop1 < prop2) return -1;
  if (prop1 > prop2) return 1;
  return 0;
});

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

【讨论】:

  • 如果您可以在codesandboxjsfiddle 上给我您的代码sn-p,我会很容易理解问题出在哪里
  • 对不起,当然是:jsfiddle.net/dxfbLz2u/1
  • 您在排序后调用totalPhaseVal(),因此您只需在sort 之前运行函数totalPhaseValSOLUTION。其他一切,如果完美的话......
  • 天哪,我已经看了好几个小时了,这就是问题所在,而不是我 2 小时前的排序。非常感谢老兄。
  • 你只需要一步一步调试。您主要错过了调试步骤...?我们都从错误中吸取教训
【解决方案2】:

您可以从每个对象的键中获取数字并使用数字 sort()

const d=[
  { phase4: 3 },
  { phase3: 4 },
  { phase2: 14 },
  { phase1: 46 },
  { phase6: 12 },
  { phase5: 1 },
  { phase11: 11 },
  { phase22: 22 }
]

const keyNum = (e) => Object.keys(e)[0].match(/\d+$/)[0];

const res = d.sort((a,b) => keyNum(a) - keyNum(b))

console.log(res)

【讨论】:

  • 感谢您回答我的问题。您提供的两种解决方案都有效!
猜你喜欢
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 2023-03-11
  • 2011-09-03
  • 1970-01-01
  • 2023-01-19
  • 2021-06-06
  • 1970-01-01
相关资源
最近更新 更多