我正在编写一个脚本,它在两个系统之间同步用户。让我们说来源和目标系统。
为了帮助同步它们,我希望将源系统中的用户ID存储为目标系统中的ID。
不幸的是,目标系统对于我可以存储的属性有一个最大的字符长度。
如果可能的话,我想避免创建一个新的表来保持这种关系。
我无法截断它,因为我需要能够从目标系统中返回到源系统中的用户。
有编码和解码源用户ID的方法吗?
编辑:
源系统中的ID将始终遵循以下结构:
/^[a-zA-Z0-9]{6}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{3}-[a-zA-Z0-9]{6}$/
例如:mdn 0092-banc-mdn-mdn 1023
除了最大字符长度为20之外,没有限制可以存储在目标系统中的内容。
发布于 2022-11-23 09:28:46
当你最初发布你的问题时,你似乎需要一个大的转换(将一个20个字符长的ID压缩成更短的东西,这将是一个相当大的问题。)但是现在编辑之后,看起来很容易:
目标系统中有20个可用字符,但源系统中的ID只有19个可变字符加上固定位置上的3个破折号。
因此,当从源转换到目标时,只需删除破折号。这将给您一个长度为19的字符串,这将完全适合您的20个字符宽字段的目标系统。由于破折号位于固定位置,它们不带任何语义(移除它们不会干扰您ID的唯一性)。
当从目标转换回源的时候,你知道在你的ID中,破折号必须去哪里,即在你的压缩ID的第6,10,13字符之后。所以把它们放回到正确的地方,你有你的源系统的ID格式。
let
original = 'as0092-banc-mdn-da1023', //this is the key from your example
target = original.replace(/-/g, ""), //this removes all dashes
source = target.slice(0, 6) + "-" //this takes certain portions of your squished ID
+ target.slice(6, 10) + "-" //and inserts dashes between them
+ target.slice(10, 13) + "-"
+ target.slice(13)
console.log("original ", original, " length", original.length);
//the mapped ID fits perfectly into your target system's length restriction
console.log("target ", target, " length", target.length);
//the reversed mapping is equal to your original ID
console.log("source ", source, " length", source.length);
console.log("test eq ", source === original);
当然还有其他的可能性,可以删除和读取破折号,但我认为您理解代码背后的想法。
https://stackoverflow.com/questions/74539247
复制相似问题