当'var array = {}'时,如何解决“TypeError:array.splice不是函数”?

时间:2012-11-23 08:09:12

标签: javascript jquery arrays

  

可能重复:
  How to remove a property from a javascript object
  JavaScript Hashmap Equivalent

我正在使用jQuery,我正在以这种方式处理变量:

var array = {};

array[an_object]      = something
array[another_object] = something_else
array[...]            = ...

当我尝试在array上运行splice方法时,我得到TypeError: array.splice is not a function我的目的是删除an_object"键"及其array变量的所有内容。

我该怎么做?


注意:当我运行console.log(array[an_object])(同样适用于another_object和所有其他对象)时,我得到:

[Object { label="str1",  value=1 }, Object { label="str2",  value=2 }, { label="strN",  value=N }]

5 个答案:

答案 0 :(得分:18)

首先,将变量命名为它们。如果您使用它来创建对象,那么您使用的名称array会产生误导。

var myObject = {};

myObject[an_object]      = "xyz";
myObject[another_object] = "abc";

现在,您可以使用delete语句删除对象中的条目:

delete myObject[an_object]; // Returns true / false if the deletion is a success / failure
console.log(myObject[an_object]) // Returns undefined

现在,那说,这不会像你期望的那样奏效。 myObject[an_object]将包含“abc”
不要将对象用作键。请改用字符串。
这是因为在[]中输入的任何参数都将转换为字符串。实际上,您正在输入myObject["[object Object]"]

答案 1 :(得分:5)

我对构建对象的方式感到有些困惑,因为用作键的an_object必须是键的字符串值。假设你这样做,这应该通过删除对象的不受欢迎的属性来工作。

var array = {};

array['an_object'] = "something"
array['another_object'] = "something_else"

delete(array.an_object)

console.log(array) // Object { another_object = "something_else" }

修改

如评论中所述,如果问题是对象被用作另一个对象的键(在这种情况下容易混淆地命名为array),那么问题是对象首先被转换为它的字符串表示形式用于对象键的上下文中。因此,用作键的所有对象实际上都会引用一个名为[object Object]的键,而您用作键的对象将覆盖以前的键。

在问题的例子中......

array[an_object]      = something
array[another_object] = something_else
// array: Object { "[object Object]" = "something_else" }

答案 2 :(得分:1)

要在简单的JavaScript中实现字典是相当棘手的,您需要创建一个完整的构造函数来处理它 - 或者使用一个可以为您处理此问题的库。

By Dictionary我指的是一个可以使用对象作为键的对象/哈希。你需要一个使用多个数组的构造函数(一个用于键,一个用于值),这将使它们保持同步。您可以模仿许多典型的数组方法,但正如我所说,这将是相当多的代码。

作为一种简单的替代方案,您可以执行以下操作:

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

答案 3 :(得分:0)

也许是这样的:

Fiddle

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]);

答案 4 :(得分:0)

您无法在对象上触发数组方法。您创建对象文字而不是数组的情况,将其定义为var a = []var a = new Array();

希望它有所帮助!!