如何用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
相关产品推荐
相关产品推荐

