【问题标题】:Is there a way to ensure javascript object properties are ordered in a specific way?有没有办法确保 javascript 对象属性以特定方式排序?
【发布时间】:2019-02-11 16:58:50
【问题描述】:

我有一个如下所示的 JavaScript 对象:

Const data = {
x: 1,
y: 2,
z: 3
a: 4,
b: 5,
c: 6
};

我们的 Angular 6 应用程序中有一个签名服务,它对该对象进行字符串化,对字符串进行哈希处理,然后为其附加签名。然后将其保存到 Firestore 数据库。数据库喜欢按字母顺序排列属性,所以它最终看起来像这样:

{
a: 4,
b: 5,
c: 6,
x: 1,
y: 2,
z: 3
}

当我们从数据库中检索此对象并尝试验证签名时,它失败了。它失败了,因为当您对 this 对象进行字符串化时,属性的字母顺序会导致与我们签名时不同的字符串。这会导致与原始签名不匹配的不同哈希值。

我们目前对这个问题的解决方案是我们在代码中按字母顺序写出属性的顺序,但我们想证明这一点(例如,如果另一个开发人员出现并在底部添加一个属性,说 d,没有意识到它应该是按字母顺序排列的)。一位同事告诉我,有一些方法可以告诉 Javascript 根据自己的算法对属性进行排序。如果我们能做到这一点,那么我们会在字符串化、散列和签名之前根据该算法对属性进行排序,然后当我们从数据库中检索对象时,做同样的事情:根据 Javascript 的算法对属性进行排序,字符串化、哈希和验证。

有谁知道这个 Javascript 排序是什么以及怎么做?

【问题讨论】:

  • 没有。如果您需要保证顺序,请使用数组
  • 为什么不存储完整的 JSON 字符串呢?
  • 通常我把它变成key : value对象的数组,然后按值排序

标签: javascript properties


【解决方案1】:

JS 没有办法自然地对对象进行排序,您将不得不自己修改它。

我能想到的最简单的方法是使用数组并从那里排序。

这将返回以下数组...

Object.entries(test).sort((a, b) => a[1] - b[1])

返回

[ [ 'x', 1 ],
  [ 'y', 2 ],
  [ 'z', 3 ],
  [ 'a', 4 ],
  [ 'b', 5 ],
  [ 'c', 6 ] ]

如果你想让它回到一个对象中,

Object.assign({}, ...Object.entries(test).sort((a, b) => a[1] - b[1]).map(([key, value]) => ({[key]: value})) )

返回

{ x: 1, y: 2, z: 3, a: 4, b: 5, c: 6 }

【讨论】:

  • 谢谢,我会建议这是一个可能的解决方案。
【解决方案2】:

创建一个自定义的 stringify 函数来处理以正确顺序放置对象。

const data = {
 a: 4,
 b: 5,
 c: 6,
 x: 1,
 y: 2,
 z: 3
}

function customStringify(d){
  return '{'+Object
  .entries(d)
  .sort(([,v1],[,v2])=>v1-v2)
  .map(([k,v])=>`${k}:${v}`)
  .join(",")+'}';
}

const res = customStringify(data);

console.log(res);

【讨论】:

  • 谢谢,我会建议这是一个可能的解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
  • 2021-07-04
  • 2016-03-29
相关资源
最近更新 更多