使用Javascript对象作为对象键
我正试图设计一种方法,使用一个简单的Javascript对象(一级深键值对)作为另一个对象的键。我知道仅使用对象而不进行字符串化将导致使用Javascript对象作为对象键,javascript,object,key,underscore.js,Javascript,Object,Key,Underscore.js,我正试图设计一种方法,使用一个简单的Javascript对象(一级深键值对)作为另一个对象的键。我知道仅使用对象而不进行字符串化将导致[object object]被用作键;请看以下内容:(所以这个问题不是重复的) 有一种方法考虑到了这一点,也考虑到了按对象键排序的需要,因为它们的顺序没有保证,但是包含的Javascript代码运行了100行。我们使用的是underline.js库,因为它与主干网密切相关,但纯Javascript的替代方案也会引起人们的兴趣 这里是一个基于下划线的解决方案,它依
[object object]
被用作键;请看以下内容:(所以这个问题不是重复的)
有一种方法考虑到了这一点,也考虑到了按对象键排序的需要,因为它们的顺序没有保证,但是包含的Javascript代码运行了100行。我们使用的是underline.js库,因为它与主干网密切相关,但纯Javascript的替代方案也会引起人们的兴趣 这里是一个基于下划线的解决方案,它依赖于首先将对象转换为键值对
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"]]
我编写了一个接受任意键的哈希表实现,但我怀疑您会因为文件相对较大而拒绝它
在ECMAScript 6中,您可以使用
var-map=newmap();
var keyObj={a:“b”},
keyFunc=函数(){},
keyString=“foobar”;
//设置值
map.set(keyObj,“与keyObj关联的值”);
map.set(keyFunc,“与keyFunc关联的值”);
set(键串,“与'foobar'关联的值”);
console.log(map.size);//3.
//获取值
console.log(map.get(keyObj));//“与keyObj关联的值”
console.log(map.get(keyFunc));//“与keyFunc关联的值”
console.log(map.get(keyString));//“与‘字符串’关联的值”
console.log(map.get({a:b}));//未定义,因为keyObj!=={a:“b”}
console.log(map.get(function(){}));//未定义,因为keyFunc!==函数(){}
console.log(map.get(“foobar”);//“与'foobar'关联的值”
//因为keyString==='foobar'
您可以使用这样的模式。这样,对象的键就是为每个对象生成的随机id
var MyObject = function(name) {
this.name = name;
this.id = Math.random().toString(36).slice(2);
}
MyObject.prototype.toString = function() {
return this.id;
}