【问题标题】:Javascript - Sort by values using reduce function [duplicate]Javascript - 使用reduce函数按值排序[重复]
【发布时间】:2020-09-02 06:08:01
【问题描述】:

尝试从最低和最高值对以下对象进行排序/重新排序

{ 'xlg': '10',
  'lg': '9.6',
  'md': '9',
  'sm': '5',
  'xsm': '3',
  'xxsm': '2',
  'xxxsm': '1.75',
  'xxxxsm': '1'}

类似这样的:

{ 'xxxxsm': '1',
  'xxxsm': '1.75',
  'xxsm': '2',
  'xsm': '3',
  'sm': '5',
  'md': '9',
  'lg': '9.6',
  'xlg': '10'}

到目前为止,这是我的输入:

const sortObjectByValues = object => {
    const sortedArray = Object.values(object).sort();
    const sortedObject = sortedArray.reduce((acc, cur) => {
       // No idea....
        return acc;
    }, {});

    return sortedObject;
};

我确信我可以使用 reduce 功能进行锻炼。任何人都可以帮我解决这个问题吗?

谢谢

【问题讨论】:

  • “使用 reduce 函数按值排序” reduce 不是正确的排序工具。为什么你认为你需要使用它?
  • 另请注意,虽然对象属性现在确实有顺序,但使​​用该顺序几乎不是一个好主意。如果要排序,请使用数组。

标签: javascript arrays sorting reduce


【解决方案1】:

reduce相比,使用sort按数值顺序对对象条目进行排序会更容易:

const obj = { 'xlg': '10',
  'lg': '9.6',
  'md': '9',
  'sm': '5',
  'xsm': '3',
  'xxsm': '2',
  'xxxsm': '1.75',
  'xxxxsm': '1'};
const result = Object.fromEntries(
  Object.entries(obj)
    .sort((a, b) => a[1] - b[1])
);
console.log(result);

【讨论】:

  • 谢谢 - 如果 value 不是一个数字,而是像 '1.75em' , '9.6em' 这样的东西怎么办。对不起队友
  • 然后首先使用您喜欢的任何方法从字符串中取出数字部分,然后比较该部分。例如[\d.]+ 可以工作
【解决方案2】:

使用对象条目,使用数字值对它们进行排序,然后再次构建对象。

更新:更新了当字符串具有数字前/后字符时处理的答案。 (基本上是从字符串中提取数字)。

const obj = {
  xlg: "10",
  lg: "9.6",
  md: "9",
  sm: "5",
  xsm: "3",
  xxsm: "2",
  xxxsm: "1.75",
  xxxxsm: "1",
  abc: "abc2.05def",
  usd: "$3.15",
  xyz: "1.72em"
};

const extractNumber = ([,str]) => str.replace(/[a-zA-Z$]+/g, '');

const result = Object.fromEntries(
  Object.entries(obj).sort((a, b) => extractNumber(a) - extractNumber(b))
);

console.log(result);

【讨论】:

  • 谢谢 - 如果 value 不是数字,而是像 '1.75em' , '9.6em' 这样的东西怎么办。对不起队友
  • @DannyKim,我之前错过了,刚刚更新了答案。首先从字符串中提取数字(上面是正则表达式的一个示例),然后在排序中使用它。这应该适用于1.75em$2.0 等。希望这会有所帮助。
【解决方案3】:
Object.keys(t)
    .sort((a,b) => parseFloat(t[a]) - parseFloat(t[b]))
    .reduce((acc, key) => ({ ...acc, acc[key]:t[key] }), {});

【讨论】:

  • 虽然此代码可以解决 OP 的问题,但最好包含关于您的代码如何解决 OP 问题的说明。通过这种方式,未来的访问者可以从您的帖子中学习,并将其应用到他们自己的代码中。 SO 不是编码服务,而是知识资源。此外,高质量、完整的答案更有可能得到支持。这些功能,以及所有帖子都是独立的要求,是 SO 作为一个平台的一些优势,使其与论坛区分开来。您可以编辑以添加其他信息和/或使用源文档补充您的解释。
  • 你是绝对正确的@SherylHohman
猜你喜欢
  • 2018-10-19
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 2014-05-10
  • 2021-07-27
相关资源
最近更新 更多