使用Javascript对象作为对象键

时间:2015-03-11 14:18:00

标签: javascript object key underscore.js

我正在尝试设计一种方法来使用简单的Javascript对象(一级深度键值对)作为另一个对象的键。我知道仅仅使用没有字符串化的对象将导致[Object object]被用作键;请参阅以下内容:Using an object as a property key in JavaScript(所以这个问题不重复)。

a blog post about it考虑​​到了这一点,并且还考虑了按对象键排序的需要,因为它们的顺序无法保证,但包含的Javascript代码运行超过100行。我们正在使用underscore.js库,因为它与骨干网密切相关,但纯Javascript替代品也会引起人们的兴趣。

4 个答案:

答案 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)

我编写了一个接受任意键的哈希表实现,但我怀疑你会因文件大小相对而拒绝它。

https://code.google.com/p/jshashtable/

答案 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')