使用 lodash/Javascript 对数字数组进行排序

2023-11-30

我有一个字符串数组,如下所示。

let arr = ["1", "1+", "1-","2", "2+", "3","3+", "2-", "3-", "4", "10"];

我想要如下的预期输出。

["1+", "1", "1-", "2+", "2", "2-", "3+", "3", "3-", "4", "10"];

我尝试了下面的代码,但它没有给我正确的结果。

let arr = ["1", "1+", "1-","2", "2+", "3","3+", "2-", "3-", "4", "10"];
let result = arr.sort((a,b) => { 
  return a.localeCompare(b, undefined, {
      numeric: true,
      sensitivity: 'base',
    });
  });

console.log(result);

因此,您需要数字和符号的比较器。

一般概念:
您可以像这样定义符号优先级:

const signPriority = {
  '+': 0,
  'n': 1, // n = no sign
  '-': 2,
} 

Where key是符号并且value是我们将在比较器中使用的符号权重('n'意思是“没有迹象”)。

然后我们将数组元素拆分为数字和符号,在比较器函数中并分别比较它们:

arr.sort((a, b) => { 
    // If numbers are different ...
    if (parseInt(a) !== parseInt(b)) {
        // Just compare a numbers 
        return parseInt(a) - parseInt(b);
    } else {
        // If sign matter ...
        // Extract sign from element or define as 'n' if no sign found
        const sign_a = ['+', '-'].includes(a.slice(-1)) ? a.slice(-1) : 'n';
        const sign_b = ['+', '-'].includes(b.slice(-1)) ? b.slice(-1) : 'n';
        // Compare signs using their weight
        return signPriority[sign_a] - signPriority[sign_b];
    } 
})

完整解决方案:

const signPriority = {
    '+': 0,
    'n': 1,
    '-': 2,
} 

const arr = ["1", "1+", "1-","2", "2+", "3","3+", "2-", "3-", "4", "10"];

const sorted = arr.sort((a, b) => { 
    if (parseInt(a) !== parseInt(b)) {
        return parseInt(a) - parseInt(b);
    } else {
        const sign_a = ['+', '-'].includes(a.slice(-1)) ? a.slice(-1) : 'n';
        const sign_b = ['+', '-'].includes(b.slice(-1)) ? b.slice(-1) : 'n';
        return signPriority[sign_a] - signPriority[sign_b];
    } 
})

console.log(sorted);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 lodash/Javascript 对数字数组进行排序 的相关文章

随机推荐

  • 使用 MinGW 编译器编译 C++ 程序时如何增加堆栈大小

    我正在尝试编译提供给我的程序 该程序测试提供不同值时算法快速排序的运行时间 我需要增加堆栈的大小才能运行非常大的数字 我阅读使用以下命令 g Wl stack
  • 使用 Windows 身份验证创建基于角色的授权

    我有一个 ASP NET Core 应用程序 我想在其中添加基于角色的身份验证 我使用 Windows 身份验证 因为它是一个 Intranet 应用程序 我已经有一个自定义数据库 其中包含坦率地说未映射到 IdentityFramewor
  • h1标签小于h2,全部在section标签内

    我的 h1 标签位于节标签内 比 h2 标签小 当 h1 标签位于部分标签之外时 其尺寸是正确的 我一直在浏览我的 CSS 页面 但没有发现任何可以实现这一点的东西 body font 100 1 4 Verdana Arial Helve
  • 方差分析无法进行多级分析 - “未为此 S4 类定义 $ 运算符”

    当尝试进行与多级分析相关的方差分析时 我在 R 中运行代码时遇到问题 我总是收到错误 未为此 S4 类定义 运算符 Model 0 Model without teams grand mean centered h2 0 gmc lt lm
  • Core-Plot:Interface Builder 文件中存在未知类 CPLayerHostingView

    Using 核心情节似乎不是一个容易的集成任务 标头路径已设置 在 Interface Builder 中我创建了一个CPLayerHostingView它属于由 Interface Builder 实例化的视图控制器 加载 nib 文件后
  • 6.0.0 版本中未安装 mongo.exe

    我从这里安装了 MongoDB 社区服务器link 但当我调查C Program Files MongoDB Server 6 0 bin 我无法找到 mongo exe 文件 我可以看到 mongod exe 和 mongos exe 有
  • C中的宏定义错误?

    define SOUND SPEED 0 034 int rtt round trip time in microsecond double distance distance double rtt SOUND SPEED 2 它抱怨错误
  • IE 忽略定位元素上的 Z-Index

    事实证明 IE 再次成为我生存的祸根 我正在开发的网站顶部有一个水平菜单 其中的一个项目会触发一个纯 CSS 菜单 该菜单绝对定位在父菜单 DIV 内 相对定位 这使得菜单可以完美地放置在 IE 和 W3C 兼容浏览器中 当我在页面下方有更
  • 在 C# 中使用 Windows 窗体隐藏/阻止选项卡

    问题是我有一个 登录窗口 和一个 主窗口 在按下登录按钮或 访客 按钮后调用 如果按登录按钮 整个系统都会出来 如果我按访客按钮 一个选项卡应该消失或被阻止或其他什么 private void visitant object sender
  • 按周/月//季度/年分区以突破分区限制?

    我有 32 年的数据想要放入分区表中 但是 BigQuery 说我超出了限制 4000 个分区 对于这样的查询 CREATE TABLE deleting day partition PARTITION BY FlightDate AS S
  • ClickOnce 和 .NET 5:用户设置未更新

    我已将我的一个 WPF 应用程序从 NET Framework 4 7 更新到 NET 5 它使用 ClickOnce 安装程序来安装更新 自从更改为 NET 5 以来 我使用 AssemblyVersion 来设置版本 而不是依赖 Cli
  • 如何命名一组类型边界? [复制]

    这个问题在这里已经有答案了 如果我有一长串必须在很多地方重复的类型界限 我该如何给它们命名 例如 如果不是 fn foo
  • 如何获取CSS类中元素的属性集

    我想读取元素的高度和宽度 div style width 50px div div class big div For box01我可以用height getElementById box01 style height 没关系 但对于 bo
  • 我在 Consumer 内部收到 NullPointerException

    我正在尝试生产者 消费者问题 但我不知道为什么我会遇到这样的问题java lang NullPointerException在消费者内部 package com import java util concurrent PriorityBlo
  • 使用 HTML Canvas 创建反射图像?

    我有以下代码 尝试将垂直镜像图像与透明背景颜色渐变结合起来 当组合这两种效果时 它失败了 我是否需要在画布上覆盖 PNG 渐变 而不是尝试让画布执行这两种操作
  • 从命令行进行 MariaDB 备份

    开发者控制台中用于创建备份的备份功能非常棒 然而 我希望能够实现自动化 有没有办法从 cf 命令行应用程序执行此操作 Thanks 这是不可能从cf cli 但是有一个API端点用于触发备份 API 文档 自定义扩展 Swisscom 应用
  • 导航到流。使用什么 URI(如果有)来解析相对链接?

    我有一个 WPF 应用程序 它使用
  • Laravel Vagrant Up SSH 问题

    我正在尝试在 homestead vagrant 的帮助下创建一个 Laravel 应用程序 我使用的是Windows 7开发环境 我正在使用按项目安装 并且在 Laravel 文档中我可以流浪我的项目 当我在项目中流浪时 我会陷入困境 S
  • 使用 Symfony DI 容器的原则 2

    我正在开发一个利用 Doctrine 2 的 Zend Framework 项目 我试图让 Symfony 的 DI 容器也与该项目一起工作 但我遇到了麻烦 假设我有一个类 Foo 需要注入两个实例 我可以毫无问题地设置一个 Symfony
  • 使用 lodash/Javascript 对数字数组进行排序

    我有一个字符串数组 如下所示 let arr 1 1 1 2 2 3 3 2 3 4 10 我想要如下的预期输出 1 1 1 2 2 2 3 3 3 4 10 我尝试了下面的代码 但它没有给我正确的结果 let arr 1 1 1 2 2