关于javascript:如何解决”var array=”时的”typeerror:array.splice is not a function”?

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[...]            = ...

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

我怎么能做到?

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

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

现在,也就是说,这不会像你预期的那样奏效。myObject[an_object]将包含"abc"不要将对象用作键。而是使用字符串。这是因为在[]中输入的任何参数都将转换为字符串。所以实际上,你进入了myObject["[object Object]"]


我对您构建对象的方式有点困惑,因为用作键的an_object必须是键的字符串值。假设您这样做,那么应该通过删除对象的不需要的属性来实现。

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" }

编辑

如注释中所述,如果问题是对象被用作另一个对象的键(在本例中,名称混乱的array),那么问题是首先将对象转换为它的字符串表示形式,以便在对象键的上下文中使用。因此,所有用作键的对象实际上都将引用一个名为[object Object]的键,而用作键的对象将覆盖以前的对象。

在这个问题的例子中…

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); /// {}

事后思考

显然,更好的选择是为此创建自己的专用构造函数,但是您可以用更多的代码来改进上面的内容,这样它就不会修改键对象。相反,无论何时使用对象作为键,您都可以扫描pushToObject.index以查找键对象的偏移量。我选择了修改关键对象的版本,但是它的运行速度比每次修改数组时扫描列表的速度要快。

获取键功能

上面的代码只向您展示了如何添加和删除,从偏移量中获取特定的键对象也是一个好主意:

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

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

希望它有帮助!!


可能是这样:

小提琴

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