【问题标题】:JavaScript array of objects sort by specific property and then group by custom priority valuesJavaScript 对象数组按特定属性排序,然后按自定义优先级值分组
【发布时间】:2021-09-24 06:51:05
【问题描述】:

我有一组对象,我的要求是按状态对用户进行分组(在线用户应该排在第一位),同时按名称对分组的用户进行排序。 我能够实现结果,但在这里我单独使用 lodash concat 函数。任何人都可以帮助将它与 chain 功能一起使用吗?

代码:

  import _ from 'lodash';

  const { online = [], offline = [] } = _.chain(users)
    .sortBy([(e) => _.toLower(e.name)])
    .groupBy((e) => e.status)
    .value();
  const result = _.concat(online, offline);
  console.log('grouped users sorted by name => ', result);

输入:

let users = [
    {
        'name': 'C',
        'status': 'online'
    },
    {
        'name': 'd',
        'status': 'online'
    },
    {
        'name': 'a',
        'status': 'offline'
    },
    {
        'name': 'b',
        'status': 'online'
    },
    {
        'name': 'f',
        'status': 'offline'
    },
    {
        'name': 'e',
        'status': 'offline'
    }
];

输出:

[
    {
        'name': 'b',
        'status': 'online'
    },
    {
        'name': 'C',
        'status': 'online'
    },
    {
        'name': 'd',
        'status': 'online'
    },
    {
        'name': 'a',
        'status': 'offline'
    },
    {
        'name': 'e',
        'status': 'offline'
    },
    {
        'name': 'f',
        'status': 'offline'
    }
]

谢谢

【问题讨论】:

    标签: javascript arrays sorting grouping lodash


    【解决方案1】:

    如果你能正确输入:

    let users = [
        {
            name: 'C',
            status: 'online'
        },
        {
            name: 'd',
            status: 'online'
        },
        {
           name: 'a',
            status: 'offline'
        },
        {
            name: 'b',
            status: 'online'
        },
        {
            name: 'f',
            status: 'offline'
        },
        {
            name: 'e',
            status: 'offline'
        }
    ];
    
    const sorted = users.sort((a, b) => {
    if (a.name.toLowerCase() < b.name.toLowerCase()) {
        return a.status.toLowerCase() < b.status.toLowerCase() ? 1 : -1;
      }
       return b.status.toLowerCase() < a.status.toLowerCase() ? -1 : 1;;
    
    })
    console.log(sorted )

    【讨论】:

    • 谢谢@Nikola Pavicevic
    【解决方案2】:

    不用lodash也可以轻松做到这一点。

    您可以在调用数组的sort() 函数时使用自定义排序函数。创建一个排序字符串,其中 0 表示在线用户,1 表示离线用户,后跟名称。然后在比较中使用这个排序字符串。

    let users = [{
        'name': 'C',
        'status': 'online'
      },
      {
        'name': 'd',
        'status': 'online'
      },
      {
        'name': 'a',
        'status': 'offline'
      },
      {
        'name': 'b',
        'status': 'online'
      },
      {
        'name': 'f',
        'status': 'offline'
      },
      {
        'name': 'e',
        'status': 'offline'
      }
    ];
    
    users.sort((a, b) => {
      let sortStringA = (a.status.toUpperCase() == 'ONLINE' ? 0 : 1) + a.name.toUpperCase();
      let sortStringB = (b.status.toUpperCase() == 'ONLINE' ? 0 : 1) + b.name.toUpperCase();
      if (sortStringA < sortStringB) {
        return -1;
      }
      if (sortStringA > sortStringB) {
        return 1;
      }
      return 0;
    });
    
    console.log(users);

    【讨论】:

    • 感谢@MarkBaijens 简单直接的解决方案。
    【解决方案3】:

    您可以使用reducefiltersort。创建一个单独的数组并按照您希望最终数组的顺序添加状态。然后在reduce回调中使用filter获取该状态的元素并使用sort按照name的顺序对元素进行排序

    let sortStatus = ['online', 'offline'];
    let users = [{
        name: 'C',
        status: 'online'
      },
      {
        name: 'd',
        status: 'online'
      },
      {
        name: 'a',
        status: 'offline'
      },
      {
        name: 'b',
        status: 'online'
      }
    ];
    let data = sortStatus.reduce((acc, curr) => {
      acc.push(
        ...users
        .filter(item => item.status === curr)
        .sort((a, b) => a.name.localeCompare(b.name))
      );
      return acc;
    }, []);
    console.log(data);

    【讨论】:

    • 感谢@brk 我正在寻找使用 lodash 或普通 js 的解决方案(但简单的解决方案)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2019-11-21
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    相关资源
    最近更新 更多