要在简单的 JavaScript 中实现字典是相当棘手的,您需要创建一个完整的构造函数来处理这个 - 或者使用一个库来为您处理这个。
通过字典,我指的是可以将对象用作键的对象/散列。您将需要一个使用多个数组(一个用于键,一个用于值)并保持它们同步的构造函数。您可以模仿许多典型的数组方法,但正如我所说,这将是相当多的代码。
作为一个简单的替代方案,您可以执行以下操作:
function pushToObject(obj, key, value){
if( !key||!obj ) return false;
if( !key[''] ) {
pushToObject.index = pushToObject.index||[];
key[''] = pushToObject.index.length;
pushToObject.index.push(key);
}
obj[key['']] = value;
return true;
}
function removeFromObject(obj, key){
if( !isNaN(key) ) {
var list = listKeyObjects(obj);
var item = list[key];
return removeFromObject(obj,item);
}
else if(key) {
if( !key[''] ){
return false;
}
return delete obj[key['']];
}
return false;
}
function listKeyObjects(obj){
var a = [];
for(var i in obj){
a.push(pushToObject.index[i]);
}
return a;
}
用法
var array = {}; /// it would be best to change the name of this object
var an_object = {}, another_object = {};
/// add your items to the array object, this handles giving each of your
/// objects used as a key a unique index property. This does mean the objects
/// you use `an_object`, `another_object` are modified.
pushToObject( array, an_object, 'something else' );
pushToObject( array, another_object, 'something other than else' );
console.log(array); /// {0:'something else',1:'something other than else'}
removeFromObject( array, an_object ); /// remove using an object as a key
console.log(array); /// {1:'something other than else'}
removeFromObject( array, 0 ); /// remove using an offset index
console.log(array); /// {}
经过思考
显然,更好的选择是为此创建自己的专用构造函数,但您可以使用更多代码改进上述内容,这样它就不会修改关键对象。相反,每当将对象用作键时,您都可以扫描pushToObject.index
键对象的偏移量。我选择了修改您的关键对象的版本,但是因为它应该比每次进行数组修改时都扫描列表更快。
获取关键函数
上面的代码只向您展示了如何添加和删除,从偏移量获取特定的关键对象也可能是一个好主意:
function getKeyObjectAtIndex = function(obj, index){
var list = listKeyObjects(obj);
return list[index] ? list[index] : null;
}
console.log(array); /// {0:'something else',1:'something other than else'}
var key = getKeyObjectAtIndex(array, 1);
console.log(key === another_object) /// === TRUE