Nodejs JSON.parser()的问题,求大神们支招
Nodejs JSON.parser()的问题,求大神们支招
JSON.parser()解析的时候按照数字大小进行自动排序…我想按照源数据排序。怎么弄… 比如: 源数据"data":{“70”:24442,“7080”:106,“7000”:45,“71”:29,“7088”:18,“7081”:13,“72”:13,“543”:12,“7080”:12,“9080”:12} 解析之后: data: { ‘70’: 24462, ‘71’: 29, ‘72’: 13, ‘543’: 12, ‘6080’: 12, ‘7000’: 45, ‘7080’: 106, ‘7081’: 13, ‘7088’: 18, ‘9080’: 12 }
Node.js 中 JSON.parse() 的问题:保持对象属性顺序
在 JavaScript 中,对象的属性是没有固定的顺序的。虽然现代浏览器和 Node.js 引擎会尝试保持插入顺序(特别是在 ES6 之后),但这种行为并不是标准的一部分。因此,在使用 JSON.parse()
解析 JSON 字符串时,你可能会发现属性顺序发生了变化。
如果你想确保解析后的对象属性顺序与原始数据中的顺序一致,你需要手动进行排序。
示例代码
假设你有以下 JSON 字符串:
{
"data": {
"70": 24442,
"7080": 106,
"7000": 45,
"71": 29,
"7088": 18,
"7081": 13,
"72": 13,
"543": 12,
"7080": 12, // 注意这里有重复的键
"9080": 12
}
}
解析并排序后的代码如下:
const jsonString = `
{
"data": {
"70": 24442,
"7080": 106,
"7000": 45,
"71": 29,
"7088": 18,
"7081": 13,
"72": 13,
"543": 12,
"7080": 12,
"9080": 12
}
}
`;
// 解析 JSON 字符串
const parsedData = JSON.parse(jsonString);
// 创建一个数组来存储排序后的键
let sortedKeys = Object.keys(parsedData.data).sort((a, b) => a - b);
// 创建一个新的对象来存储排序后的数据
let sortedObject = {};
sortedKeys.forEach(key => {
sortedObject[key] = parsedData.data[key];
});
console.log(sortedObject);
解释
- 解析 JSON 字符串: 使用
JSON.parse()
方法将 JSON 字符串转换为 JavaScript 对象。 - 提取并排序键: 使用
Object.keys()
提取对象的所有键,并通过sort()
方法按数字大小排序。 - 创建新的对象: 遍历排序后的键,并将其对应的值添加到新的对象中。
注意事项
- 在实际应用中,对象中的键不应该有重复。如果你的数据中有重复的键,最终的结果可能不会如预期。
- 如果你希望保留原始顺序,可以考虑使用数组来存储数据,而不是对象。
这样,你就可以确保解析后的对象属性顺序与原始数据中的顺序一致。
当然得自己排了,不要告诉我你不会写排序。。
var obj = JSON.parse(data);
var arr = [];
for(var key in obj){
arr.push(obj[key]);
}
//之后再排序
你是要保持源数据的排序吧?
能改源数据,就把data
改成一个对象数组;不能改源数据,就写一个自己的JSON parser。
好奇:保持顺序的意义是什么?
JSON键值对是无序的,排序信息另外进行处理
你的问题主要是因为JSON对象在JavaScript中是无序的,所以在解析后无法保持原有的顺序。如果你需要保留原始的键值顺序,可以考虑使用数组来存储这些数据。
以下是一种可能的解决方案:
const data = {
"70": 24442,
"7080": 106,
"7000": 45,
"71": 29,
"7088": 18,
"7081": 13,
"72": 13,
"543": 12,
"7080": 12,
"9080": 12
};
// 转换为有序数组
let orderedData = [];
for (let key in data) {
if (data.hasOwnProperty(key)) {
orderedData.push({key: key, value: data[key]});
}
}
// 按照key排序
orderedData.sort((a, b) => a.key - b.key);
// 如果你需要将其转换回对象形式,可以使用reduce方法
let result = orderedData.reduce((obj, item) => {
obj[item.key] = item.value;
return obj;
}, {});
console.log(result);
在这个例子中,我们首先将对象转换为一个数组,每个元素包含一个键值对。然后我们根据键值对中的键对数组进行排序。最后,我们将排序后的数组重新转换为对象。这样就能保证解析后的数据保持原有的顺序。
如果你仍然希望保留原样作为对象,但想以某种特定的顺序进行操作,可以在实际处理时根据上面的方式动态构建对象或数组。