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 }


6 回复

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);

解释

  1. 解析 JSON 字符串: 使用 JSON.parse() 方法将 JSON 字符串转换为 JavaScript 对象。
  2. 提取并排序键: 使用 Object.keys() 提取对象的所有键,并通过 sort() 方法按数字大小排序。
  3. 创建新的对象: 遍历排序后的键,并将其对应的值添加到新的对象中。

注意事项

  • 在实际应用中,对象中的键不应该有重复。如果你的数据中有重复的键,最终的结果可能不会如预期。
  • 如果你希望保留原始顺序,可以考虑使用数组来存储数据,而不是对象。

这样,你就可以确保解析后的对象属性顺序与原始数据中的顺序一致。


当然得自己排了,不要告诉我你不会写排序。。

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);

在这个例子中,我们首先将对象转换为一个数组,每个元素包含一个键值对。然后我们根据键值对中的键对数组进行排序。最后,我们将排序后的数组重新转换为对象。这样就能保证解析后的数据保持原有的顺序。

如果你仍然希望保留原样作为对象,但想以某种特定的顺序进行操作,可以在实际处理时根据上面的方式动态构建对象或数组。

回到顶部