删除 JavaScript 对象的实例
Deleting an instance of a JavaScript Object
我有一个名为 box_brick 的 JavaScript 对象:
function box_brick( attribute1, attribute2, etc )
{
this.attribute_1 = attribute1;
this.attribute_2 = attribute2;
this.attribute_etc = etc;
box_brick.instances.push(this);
}
我通过声明创建新的 box_brick:
var box_62 = new box_brick('new attribute 1', 'new attribute 2', 'etc');
这对我的应用程序很有效,给了我 box_brick.instances:
我的代码设置方式,每次创建一个新框时,我都有 box_brick.instances 中的实例以及一个独立对象,然后我可以直接打电话从中获取信息。例如得到brick_60's color, I can just invoke brick_60.box_color, and in this case I would receive '#ff008c'.
(这些可能是一回事——我对对象、实例、类等之间的区别仍然有点不清楚,对此我深表歉意)
我这辈子都不知道如何从 box_brick.instances 中 删除 其中一个 box_brick -- 例如,如果我想删除 brick_60,这样它就不会再出现在 box_brick.instances 中了,我不确定该怎么做。
我试过 brick_60.delete, delete(brick_60);和许多其他事情,但我完全难住了。
任何指导将不胜感激。
您正在使用数组,因此您可以执行 delete box_brick.instances[0]
或 box_brick.instances.splice(position, 1)
。
但是,因为您使用的是数组,所以您必须使用 indexof() 找到 box_ID 的数组索引才能删除实例。
让我们尝试使用一个对象,其范围在函数构造函数之外:
// use a dictionary object to hold references to your objects:
var boxes = Object.create(null);
function box_brick(attribute1, attribute2, etc ) {
this.attribute_1 = attribute1;
this.attribute_2 = attribute2;
this.attribute_etc = etc;
var id = $.now().toString(); // use jQuery to create a unique ID from the UTC timestamp
boxes[id] = this; // easier to use a unique id to augment object
}
现在可以轻松删除框实例:
function deleteBox(id) {
if (boxes[id]) delete boxes[id];
}
由于数组没有以任何特定方式编制索引,因此唯一的方法就是遍历以找到您想要的积木。我可能会建议将您的数据结构更改为一个对象而不是一个数组,但以下是一个解决方案,让您可以正常工作。
下面是一个 deleteID
函数,它将遍历并删除具有特定 ID 的元素。在下面的例子中,我们移除 id
of "brick_2"
.
的砖块
现场演示:
var bricks = [];
bricks.push({box_id: "brick_1"});
bricks.push({box_id: "brick_2"});
bricks.push({box_id: "brick_3"});
function deleteID(id) {
for (brick in bricks) {
if (bricks[brick].box_id === id) bricks.splice(brick, 1);
}
}
deleteID("brick_2");
document.getElementById("output").textContent = JSON.stringify(bricks);
<div id="output"></div>
JSFiddle 版本:https://jsfiddle.net/fef3o6vv/
在 ES6 中,使用 Set
。
ES6 集是 "bags" 存在或不存在的东西。与必须遍历才能找到某些内容的数组不同,使用集合,您可以直接添加和删除项目。可以说,它们已按内容预先编入索引。
// constructor
function box_brick( attribute1, attribute2, etc )
{
...
box_brick.instances.add(this);
^^^^^^^^^ // add to set
}
// initialize set
box_brick.instances = new Set();
// create a new instance
box_brick_instance = new box_brick(...);
// remove it from the set
box_brick.instances.delete(box_brick_instance);
^^^^^^^^^^^^^^^^^^^^^^^^^^ // delete from set
感谢大家的帮助——我发现 elclanrs 和 Data 建议的 .splice() 函数完全符合我的期望。我正在使用以下代码并且效果很好:
for ( var i = 0; i < box_brick.instances.length; i++ )
{
if ( box_brick.instances[i].box_id == box_to_delete )
{
box_brick.instances.splice(i, 1);
}
}
虽然这不会删除盒子的独立变量/对象(因此在控制台中,我仍然可以键入 brick_55.attribute 并获取一个值),我决定只允许这些变量保留在内存中,并使用 box_brick.instances 作为我对所有 actual"master list" 的排序 与应用程序相关的框,忽略独立 var 版本(包含相同的冗余信息)。
非常感谢大家!在求助于 Whosebug 之前,我在这方面投入了很多很多时间,你们的指导正是我所需要的。
我有一个名为 box_brick 的 JavaScript 对象:
function box_brick( attribute1, attribute2, etc )
{
this.attribute_1 = attribute1;
this.attribute_2 = attribute2;
this.attribute_etc = etc;
box_brick.instances.push(this);
}
我通过声明创建新的 box_brick:
var box_62 = new box_brick('new attribute 1', 'new attribute 2', 'etc');
这对我的应用程序很有效,给了我 box_brick.instances:
我的代码设置方式,每次创建一个新框时,我都有 box_brick.instances 中的实例以及一个独立对象,然后我可以直接打电话从中获取信息。例如得到brick_60's color, I can just invoke brick_60.box_color, and in this case I would receive '#ff008c'.
(这些可能是一回事——我对对象、实例、类等之间的区别仍然有点不清楚,对此我深表歉意)
我这辈子都不知道如何从 box_brick.instances 中 删除 其中一个 box_brick -- 例如,如果我想删除 brick_60,这样它就不会再出现在 box_brick.instances 中了,我不确定该怎么做。
我试过 brick_60.delete, delete(brick_60);和许多其他事情,但我完全难住了。
任何指导将不胜感激。
您正在使用数组,因此您可以执行 delete box_brick.instances[0]
或 box_brick.instances.splice(position, 1)
。
但是,因为您使用的是数组,所以您必须使用 indexof() 找到 box_ID 的数组索引才能删除实例。
让我们尝试使用一个对象,其范围在函数构造函数之外:
// use a dictionary object to hold references to your objects:
var boxes = Object.create(null);
function box_brick(attribute1, attribute2, etc ) {
this.attribute_1 = attribute1;
this.attribute_2 = attribute2;
this.attribute_etc = etc;
var id = $.now().toString(); // use jQuery to create a unique ID from the UTC timestamp
boxes[id] = this; // easier to use a unique id to augment object
}
现在可以轻松删除框实例:
function deleteBox(id) {
if (boxes[id]) delete boxes[id];
}
由于数组没有以任何特定方式编制索引,因此唯一的方法就是遍历以找到您想要的积木。我可能会建议将您的数据结构更改为一个对象而不是一个数组,但以下是一个解决方案,让您可以正常工作。
下面是一个 deleteID
函数,它将遍历并删除具有特定 ID 的元素。在下面的例子中,我们移除 id
of "brick_2"
.
现场演示:
var bricks = [];
bricks.push({box_id: "brick_1"});
bricks.push({box_id: "brick_2"});
bricks.push({box_id: "brick_3"});
function deleteID(id) {
for (brick in bricks) {
if (bricks[brick].box_id === id) bricks.splice(brick, 1);
}
}
deleteID("brick_2");
document.getElementById("output").textContent = JSON.stringify(bricks);
<div id="output"></div>
JSFiddle 版本:https://jsfiddle.net/fef3o6vv/
在 ES6 中,使用 Set
。
ES6 集是 "bags" 存在或不存在的东西。与必须遍历才能找到某些内容的数组不同,使用集合,您可以直接添加和删除项目。可以说,它们已按内容预先编入索引。
// constructor
function box_brick( attribute1, attribute2, etc )
{
...
box_brick.instances.add(this);
^^^^^^^^^ // add to set
}
// initialize set
box_brick.instances = new Set();
// create a new instance
box_brick_instance = new box_brick(...);
// remove it from the set
box_brick.instances.delete(box_brick_instance);
^^^^^^^^^^^^^^^^^^^^^^^^^^ // delete from set
感谢大家的帮助——我发现 elclanrs 和 Data 建议的 .splice() 函数完全符合我的期望。我正在使用以下代码并且效果很好:
for ( var i = 0; i < box_brick.instances.length; i++ )
{
if ( box_brick.instances[i].box_id == box_to_delete )
{
box_brick.instances.splice(i, 1);
}
}
虽然这不会删除盒子的独立变量/对象(因此在控制台中,我仍然可以键入 brick_55.attribute 并获取一个值),我决定只允许这些变量保留在内存中,并使用 box_brick.instances 作为我对所有 actual"master list" 的排序 与应用程序相关的框,忽略独立 var 版本(包含相同的冗余信息)。
非常感谢大家!在求助于 Whosebug 之前,我在这方面投入了很多很多时间,你们的指导正是我所需要的。