37

可能重复:
如何从 javascript 对象中删除属性
JavaScript Hashmap 等效项

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

var array = {};

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

当我尝试在上运行该splice方法时,array我得到一个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 }]
4

5 回答 5

28

首先,将变量命名为它们是什么。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]"]

于 2012-11-23T08:29:38.193 回答
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" }
于 2012-11-23T08:16:37.290 回答
1

要在简单的 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
于 2012-11-23T08:40:25.713 回答
0

也许是这样的:

小提琴

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]);
于 2012-11-23T08:24:02.287 回答
0

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

希望能帮助到你 !!

于 2012-11-23T08:36:17.083 回答