我有一个使用JSON来表示对象的客户。例如:
var person = {
fname: "John",
lname: "Doe",
nicknames: ["jake", "kevin"]
}
为了编辑这些条目,我们希望为每个对象包含GUIDS。尚未建立嵌入GUID的方法。我目前正在考虑做这样的事情:
var person = {
_guids: {
fname: "XXX",
lname: "XXX",
_nicknames: "XXX", /* This GUID corresponds to the nickname container */
nicknames: ["jake-guid", "kevin-guid"],
}
fname: "John",
lname: "Doe",
nicknames: ["jake", "kevin"]
}
如果每个项目都是它自己的对象,它将变得非常混乱,并且在不需要GUID的情况下将禁止干净的交换。然而,这种方法也导致了如何处理这样的问题:
var person = {
_guids: {
fname: "XXX",
lname: "XXX",
sacks_of_marbles: ["container-guid",
"first-sacks-guid", ["XXX", "XXX"],
"second-sacks-guid", ["XXX", "XXX"]]
}
fname: "John",
lname: "Doe",
sacks_of_marbles: [["red", "blue-with-swirls"], ["green", "pink"]]
}
有关如何保持清洁,缺乏详细程度以及包含GUID的能力的任何建议?
答案 0 :(得分:2)
在我看来,最清晰的“识别策略”首先是仅包含相关标识符,其次是在对象范围内包含这些标识符。
在您的情况下,我真的很震惊地得知fname
和lname
需要自己的标识符。它们是单个person
对象或记录的属性或属性。 person
可能会有一个ID,并且fname
上下文应该可以轻松识别相关的lname
和person
值:
var person = {
id: <guid>,
fname: "Robert",
lname: "Marley",
nicknames: ["Bob Marley"]
};
或者,如果nicknames
属性实际上是引用列表,可能是:
var person = {
id: <guid>,
fname: "Robert",
lname: "Marley",
nicknames: [{id:<guid>,nickname:"Bob Marley"}]
};
如果由于某些特殊原因,每个名称都是带有属性和标识符的半独立记录,请将其视为完全限定的对象:
var person = {
id: <guid>,
fname: {id:<guid>, name:"Robert"},
lname: {id:<guid>, name:"Marley"},
nicknames: [ {id:<guid>,nickname:"Bob Marley"} ]
};
虽然这里的第三个例子并不是非常令人困惑,但它可能比必要的要冗长得多。我强烈建议拍摄第一个例子并让上下文做它的工作。
答案 1 :(得分:1)
如果你为所有事情都包括GUID,你就不会得到清洁或缺乏冗长!也就是说,一种方法是将属性值转换为像
这样的哈希值var person = {
fname: {
value: "John",
guid: "..."
},
lname: {
value: "Doe",
guid: "..."
}
}
这样做的好处是可以任意深入地将GUID嵌套在相应的值旁边。但是,这也会为每次访问对象的值增加一些开销(因为person.fname
必须变为person.fname.value
,依此类推)。
答案 2 :(得分:0)
在审核了此处的提案以及用例后,采用了以下解决方案,并且似乎运行良好。
var person_with_guids = {
obj:{
type: "person",
fname: "fname=guid",
lname: "lname=guid",
nicknames: ["larry-guid", "curly=guid", "moe-guid"],
father: "nick-nolte-guid",
},
refs:{
fname-guid:{
display: "Johnny",
edit: "johnny"
},
lname-guid:{
display: "Walker",
edit: "walker"
},
larry-guid:{
type: "person",
...
}
}
}
var person_without_guids = {
fname: "Johnny",
lname: "Walker",
nicknames: ["Larry", "Curly", "Moe"],
father: {fname: "Nick", lname: "Nolte"}
}
如果没有深入了解选择的细节,列出的方案的优点是允许guid版本由机器翻译成sans-guid版本。有时需要人类可读的轻量级JSON,有时甚至需要显示文本和编辑文本之间的细微差别。
通过使用上面提出的方案将一切都变成一个对象并将guid嵌入其中,可以实现同样的事情。但是,这样做会导致guids被包含在已经嵌套的系统中,这使得在视觉上更难以解释。为了保持更扁平的表示,选择了查找表方法。
感谢所有回复的人。