You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript验证JSON数组符合自定义排序逻辑

验证JSON数组字符串排序规则并实现JavaScript逻辑

需求说明

给定如下JSON结构:

{  
  "outer": [ 
    { "inner" : { "displayedString" : "The 40 AOI one"} },
    { "inner" : { "displayedString" : "50 AOI one"} },
    { "inner" : { "displayedString" : "The ABI one"} },
    { "inner" : { "displayedString" : "AOI one"} },
    { "inner" : { "displayedString" : "BOI one"} }
  ]
}

需要验证outer数组中的displayedString是否遵循以下排序规则:

  • 数字优先:以数字(0-9)开头的字符串优先级高于以字母(A-Z)开头的字符串
  • 忽略前缀"The":若字符串以The (注意带空格)作为首个单词,需先移除该前缀再执行排序逻辑
    示例:
    • "The 40 AOI one" 移除前缀后为"40 AOI one",应排在"50 AOI one"之前(4 < 5)
    • "The ABI one" 移除前缀后为"ABI one",应排在"AOI one"之前(字典序ABI < AOI)

同时需要实现对应的JavaScript逻辑,完成字符串预处理、排序以及规则验证。


实现代码与解析

1. 字符串预处理函数

先实现一个工具函数,负责移除符合条件的前缀:

function processDisplayString(str) {
  // 严格匹配开头的"The ",避免误删字符串中间的"The"
  return str.startsWith('The ') ? str.slice(4) : str;
}

2. 排序比较函数

根据规则实现排序的核心逻辑,区分数字开头和字母开头的字符串,再进行比较:

function compareDisplayStrings(a, b) {
  const processedA = processDisplayString(a);
  const processedB = processDisplayString(b);

  // 判断处理后的字符串是否以数字开头
  const startsWithNumA = /^\d/.test(processedA);
  const startsWithNumB = /^\d/.test(processedB);

  // 数字开头的字符串优先级更高,排在前面
  if (startsWithNumA && !startsWithNumB) return -1;
  if (!startsWithNumA && startsWithNumB) return 1;

  // 同类型(都数字开头或都字母开头)则按字典序比较
  return processedA.localeCompare(processedB);
}

3. 验证排序是否合规的函数

通过对比原数组的字符串序列和按规则排序后的序列,判断输入是否符合要求:

function validateSorting(jsonData) {
  // 从JSON中提取所有displayedString
  const originalList = jsonData.outer.map(item => item.inner.displayedString);
  // 生成按规则排序后的列表(注意拷贝原数组,避免修改原数据)
  const sortedList = [...originalList].sort(compareDisplayStrings);
  
  // 逐位对比原序列和排序后的序列是否完全一致
  return originalList.every((str, index) => str === sortedList[index]);
}

测试示例

用给定的测试数据验证:

const testData = {  
  "outer": [ 
    { "inner" : { "displayedString" : "The 40 AOI one"} },
    { "inner" : { "displayedString" : "50 AOI one"} },
    { "inner" : { "displayedString" : "The ABI one"} },
    { "inner" : { "displayedString" : "AOI one"} },
    { "inner" : { "displayedString" : "BOI one"} }
  ]
};

console.log(validateSorting(testData)); // 输出true,说明原数组符合排序规则

如果调整原数组的顺序(比如把"The ABI one"和"50 AOI one"交换位置),再次调用validateSorting会返回false,因为数字开头的字符串优先级更高,不能被字母开头的字符串插队。


内容的提问来源于stack exchange,提问作者Ronnie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:36:01