我正在尝试设计一种方法来使用简单的Javascript对象(一级深度键值对)作为另一个对象的键。我知道仅仅使用没有字符串化的对象将导致[Object object]
被用作键;请参阅以下内容:Using an object as a property key in JavaScript(所以这个问题不重复)。
有a blog post about it考虑到了这一点,并且还考虑了按对象键排序的需要,因为它们的顺序无法保证,但包含的Javascript代码运行超过100行。我们正在使用underscore.js库,因为它与骨干网密切相关,但纯Javascript替代品也会引起人们的兴趣。
答案 0 :(得分:1)
在ECMAScript 6中,您将能够使用Maps。
var map = new Map();
var keyObj = { a: "b" },
keyFunc = function(){},
keyString = "foobar";
// setting the values
map.set(keyObj, "value associated with keyObj");
map.set(keyFunc, "value associated with keyFunc");
map.set(keyString, "value associated with 'foobar'");
console.log(map.size); // 3
// getting the values
console.log(map.get(keyObj)); // "value associated with keyObj"
console.log(map.get(keyFunc)); // "value associated with keyFunc"
console.log(map.get(keyString)); // "value associated with 'a string'"
console.log(map.get({ a: "b" })); // undefined, because keyObj !== { a: "b" }
console.log(map.get(function(){})); // undefined, because keyFunc !== function(){}
console.log(map.get("foobar")); // "value associated with 'foobar'"
// because keyString === 'foobar'

答案 1 :(得分:0)
这是一个基于下划线的解决方案,它依赖于首先将对象转换为键值对。
var myObj = { name: 'john', state: 'ny', age: 12};
var objPairs = _.pairs(myObj);
var sortedPairs = _.reduce(_.keys(myObj).sort(), function(sortedPairs, key) {
var pair = _.find(objPairs, function(kvPair) {return kvPair[0] == key});
sortedPairs.push(pair);
return sortedPairs;
}, []);
console.log(JSON.stringify(sortedPairs)); //stringifying makes suitable as object key
// [["age",12],["name","john"],["state","ny"]]
答案 2 :(得分:0)
我编写了一个接受任意键的哈希表实现,但我怀疑你会因文件大小相对而拒绝它。
答案 3 :(得分:-1)
您可以使用这样的模式。这样,您为对象创建的密钥就是您为每个对象生成的随机ID。
class UtilisateurProjetCreateForm(forms.ModelForm):
PROJETS = Projet.objects.all()
UTILISATEURS = Utilisateur.objects.all()
pro_ide = forms.ModelChoiceField(queryset = PROJETS, label = "Nom projet", widget = forms.Select, initial = Projet.objects.get(pro_ide=1))
uti_ide = forms.ModelChoiceField(queryset = UTILISATEURS, label = "Nom, prénom de l'utilisateur", widget = forms.Select)
class Meta:
model = UtilisateurProjet
fields = ('pro_ide','uti_ide')