How to solve the “TypeError: array.splice is not a function” when 'var array = {}'?
Possible Duplicate:
How to remove a property from a javascript object
JavaScript Hashmap Equivalent
我正在使用jquery,并以这种方式处理变量:
1 2 3 4 5 | var array = {}; array[an_object] = something array[another_object] = something_else array[...] = ... |
当我试图在
我怎么能做到?
注:当我运行
1 | [Object { label="str1", value=1 }, Object { label="str2", value=2 }, { label="strN", value=N }] |
首先,说出变量的名称。如果您使用它来创建一个对象,那么您使用的名称是EDCOX1(1)。
1 2 3 4 | var myObject = {}; myObject[an_object] ="xyz"; myObject[another_object] ="abc"; |
现在,可以用EDCOX1×4的语句删除对象中的条目:
1 2 | delete myObject[an_object]; // Returns true / false if the deletion is a success / failure console.log(myObject[an_object]) // Returns undefined |
现在,也就是说,这不会像你预期的那样奏效。
我对您构建对象的方式有点困惑,因为用作键的
1 2 3 4 5 6 7 8 | var array = {}; array['an_object'] ="something" array['another_object'] ="something_else" delete(array.an_object) console.log(array) // Object { another_object ="something_else" } |
编辑
如注释中所述,如果问题是对象被用作另一个对象的键(在本例中,名称混乱的
在这个问题的例子中…
1 2 3 | array[an_object] = something array[another_object] = something_else // array: Object {"[object Object]" ="something_else" } |
要用简单的javascript实现字典是相当棘手的,您需要创建一个完整的构造函数来处理这个问题,或者使用一个可以为您处理这个问题的库。
根据字典,我指的是一个可以使用对象作为键的对象/哈希。您需要一个使用多个数组(一个用于键,一个用于值)并保持它们同步的构造函数。您可以模拟许多典型的数组方法,但正如我所说,这将是相当多的代码。
作为一个简单的选择,您可以执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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; } |
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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); /// {} |
事后思考
显然,更好的选择是为此创建自己的专用构造函数,但是您可以用更多的代码来改进上面的内容,这样它就不会修改键对象。相反,无论何时使用对象作为键,您都可以扫描
获取键功能
上面的代码只向您展示了如何添加和删除,从偏移量中获取特定的键对象也是一个好主意:
1 2 3 4 5 6 7 8 9 10 | 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 |
不能在对象上激发数组方法。您的情况是创建了一个对象文本而不是数组,将其定义为
希望它有帮助!!
可能是这样:
小提琴
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | var array = {}; var an_object = {}; var another_object = {}; array[an_object] = 'something' array[another_object] = 'something_else' alert(array[an_object]); array[an_object] = null; alert(array[an_object]); delete array[an_object] alert(array[an_object]); |