【问题标题】:Will these object keys always be in same order?这些对象键是否总是以相同的顺序排列?
【发布时间】:2017-12-04 19:27:21
【问题描述】:

我正在制作多个对象,然后我 JSON.stringifying 他们。然后我将它们变成哈希。我需要以相同的顺序对所有属性进行字符串化,以便我的哈希值是一致的。例如:

function createObj(index, value, key) {
    var obj = {
        value: value,
        index: index,
        key: key
    };

    return obj;
 };


console.log(JSON.stringify(createObj(1, 'blue', 'ABC')));   // =>  {"value":"blue","index":1,"key":"ABC"}
console.log(JSON.stringify(createObj(2, 'red', 'DEF')));    // =>  {"value":"red","index":2,"key":"DEF"}
console.log(JSON.stringify(createObj(3, 'green', 'GHI')));  // =>  {"value":"green","index":3,"key":"GHI"}

我是否总是希望键按照我在createObj 函数中放置在对象上的顺序进行字符串化?创建对象后,我不再向对象添加任何属性。

如果我不能保证这个顺序,你能推荐一种为此目的保证键顺序的方法吗?

编辑:我意识到,当迭代一个对象时,键的顺序不能保证(for-inObject.keys),但是stringifying 它的顺序可以保证吗?

【问题讨论】:

  • 直接推入数组即可。
  • @NikolaLukic 推送到什么数组?
  • 现代 JavaScript 标准为属性顺序的行为提供了比以前更多的保证,但对我来说,依赖它似乎仍然很脆弱。但是我理解(也许)如果将一个“看起来”完全像另一个对象的对象字符串化会给你完全相同的 JSON 序列化字符串,那就太好了。
  • 为了什么目的需要保证订单?我想对于单元测试,您可以使用JSON.parse() 来检查返回对象的有效性。

标签: javascript object key


【解决方案1】:

MDNECMAScript Language Specification 上的 JSON.stringify() 文档未指明键的字符串化顺序。虽然对于stringnumberboolean 等基本类型,该顺序很可能是连续的,但您不能确定对象、函数、数组等。您最好的选择可能是实现您的stringify 的自己的版本,以便 100% 确定输出。

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 2022-01-15
    • 1970-01-01
    • 2016-08-31
    • 2023-03-15
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 2012-07-16
    相关资源
    最近更新 更多