我有一个名为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_bricks:
var box_62 = new box_brick('new attribute 1', 'new attribute 2', 'etc');
这适用于我的应用程序,并为我提供 box_brick.instances :
我的代码设置方式,每次创建一个新框时,我都有 box_brick.instances 中的实例,以及一个独立的对象,我可以直接调用它从中获取信息。例如,要获得 brick_60 的颜色,我可以调用 brick_60.box_color ,在这种情况下,我会收到'#ff008c'。
(这些可能是同一个 - 我仍然有点不清楚对象,实例,类等之间的区别,为此我道歉)
对于我的生活,我无法弄清楚如何从box_brick.instances 删除其中一个box_bricks - 例如,如果我想删除 brick_60 ,所以它不再是在box_brick.instances中,我不确定我会怎么做。
我尝试过brick_60.delete,删除(brick_60);还有很多其他的东西,但我完全被难倒了。
非常感谢任何指导。
答案 0 :(得分:1)
在ES6中,使用 Set
。
ES6套装是“袋子”的东西是否存在。与数组不同,您必须迭代以查找具有集合的内容,您可以直接添加和删除项目。它们按照其内容预先编入索引。
// 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
答案 1 :(得分:0)
您正在使用数组,因此您可以执行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];
}
答案 2 :(得分:0)
由于数组没有以任何特定方式编制索引,因此执行此操作的唯一方法是迭代查找所需的砖块。我可能会建议您将数据结构更改为对象而不是数组,但以下是获取您工作内容的解决方案。
下面是一个deleteID
函数,它将迭代并删除具有特定id的元素。在以下示例中,我们删除了id
"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/
答案 3 :(得分:0)
谢谢大家的帮助 - 我发现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);
}
}
虽然这不会删除框中的独立var / Object(因此在控制台中,我仍然可以键入 brick_55.attribute 并获取值),我决定只允许那些留在内存中的变量,并使用 box_brick.instances 作为与应用程序相关的所有实际框的“主列表”,而不考虑独立变量版本(包含相同的冗余信息)。
非常感谢你们!在转向StackOverflow之前我沉入了很多很多小时,而你们的指导正是我所需要的。