JavaScript中JSON数组拆分与拼接:按MaxVus匹配对应字段
JavaScript JSON转换处理:按规则提取并整理账户数据
我是JavaScript新手,需要处理以下场景:读取指定JSON字符串输入,将其拆分并拼接为包含AccountId、AccountName、MaxVus、DocCount四个数组的结构;若单个src_AccountId对应多个src_AccountName,需选取src_MaxVus值最高的条目对应的src_AccountName和src_DocCount。
示例1
输入
let json_input = "[ { \"src_AccountId\":[\"00100027H3QAK\"], \"src_AccountName\":[\"Vis Card Services\",\"Vitoria Card Services SA\"], \"src_MaxVus\":[15,3], \"src_DocCount\":[15,3] }, { \"src_AccountId\":[\"0010J000027lVFDQA2\",\"6516983c9d71be4bcd799313\"], \"src_AccountName\":[\"Semiconductor Components\",\"asdadasda\"], \"src_MaxVus\":[880,50], \"src_DocCount\":[19,10] }]";
预期输出
[ { "AccountId": [ "00100027H3QAK", "0010J000027lVFDQA2", "6516983c9d71be4bcd799313" ], "AccountName": [ "Vis Card Services", "Semiconductor Components", "asdadasda" ], "DocCount": [ "15", "19", "10" ], "MaxVus": [ "15", "880", "50" ] } ]
示例2
输入
var json_input = "[ { \"src_AccountId\":[\"00100027H3QAK\"], \"src_AccountName\":[\"Vis Card Services\",\"Vitoria Card Services SA\"], \"src_MaxVus\":[5,30], \"src_DocCount\":[2,50] }, { \"src_AccountId\":[\"0010J000027lVFDQA2\",\"6516983c9d71be4bcd799313\"], \"src_AccountName\":[\"Semiconductor Components\",\"asdadasda\"], \"src_MaxVus\":[880,50], \"src_DocCount\":[19,10] }]";
预期输出
[{"AccountId":["00100027H3QAK","0010J000027lVFDQA2","6516983c9d71be4bcd799313"],"AccountName":["Vitoria Card Services SA","Semiconductor Components","asdadasda"],"DocCount":["50","19","10"],"MaxVus":["30","880","50"]}]
解决方案代码
function processJson(jsonStr) { // 解析JSON字符串为对象数组 const data = JSON.parse(jsonStr); const result = { AccountId: [], AccountName: [], MaxVus: [], DocCount: [] }; data.forEach(item => { const accountIds = item.src_AccountId; const accountNames = item.src_AccountName; const maxVusList = item.src_MaxVus; const docCounts = item.src_DocCount; accountIds.forEach((accountId, idx) => { // 跳过已存在的AccountId,避免重复 if (result.AccountId.includes(accountId)) return; // 确定要选取的条目索引:单个AccountId对应多条目时选MaxVus最高的 let targetIndex = idx; if (accountIds.length === 1 && accountNames.length > 1) { targetIndex = maxVusList.indexOf(Math.max(...maxVusList)); } // 填充结果数组,将数字转为字符串匹配示例格式 result.AccountId.push(accountId); result.AccountName.push(accountNames[targetIndex]); result.MaxVus.push(String(maxVusList[targetIndex])); result.DocCount.push(String(docCounts[targetIndex])); }); }); // 包裹为数组格式返回 return [result]; } // 测试示例1 const input1 = `[ { "src_AccountId":["00100027H3QAK"], "src_AccountName":["Vis Card Services","Vitoria Card Services SA"], "src_MaxVus":[15,3], "src_DocCount":[15,3] }, { "src_AccountId":["0010J000027lVFDQA2","6516983c9d71be4bcd799313"], "src_AccountName":["Semiconductor Components","asdadasda"], "src_MaxVus":[880,50], "src_DocCount":[19,10] }]`; console.log(JSON.stringify(processJson(input1), null, 2)); // 测试示例2 const input2 = `[ { "src_AccountId":["00100027H3QAK"], "src_AccountName":["Vis Card Services","Vitoria Card Services SA"], "src_MaxVus":[5,30], "src_DocCount":[2,50] }, { "src_AccountId":["0010J000027lVFDQA2","6516983c9d71be4bcd799313"], "src_AccountName":["Semiconductor Components","asdadasda"], "src_MaxVus":[880,50], "src_DocCount":[19,10] }]`; console.log(JSON.stringify(processJson(input2)));
代码说明
- 解析输入:使用
JSON.parse()将JSON字符串转为JS对象数组,便于操作。 - 初始化结果:创建包含四个目标数组的结果对象。
- 遍历处理每个输入项:
- 提取当前项的四个字段数组。
- 遍历每个账户ID:跳过已存在的ID避免重复,判断是否需要选取MaxVus最高的条目,然后将对应值填充到结果数组。
- 格式匹配:将数字类型的
MaxVus和DocCount转为字符串,和示例输出格式一致。 - 返回结果:将结果对象包裹为数组,符合预期输出结构。
内容的提问来源于stack exchange,提问作者Vikas J
相关产品推荐
相关产品推荐

