2015-09-08 2 views
1

У меня есть объект JavaScript под названием 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:

enter image description here

Как мой код настроен, каждый раз, когда создается новый ящик, у меня есть как экземпляр в box_brick.instances, так и отдельный объект, который я могу позвонить напрямую, чтобы получить информацию. Например, чтобы получить цвет, я могу просто вызвать brick_60.box_color, и в этом случае я бы получил '# ff008c'.

(Это может быть один и тот же - я все еще немного неясно, на разницу между объектами, экземплярами классов, и так далее, за что я прошу прощения)

Для жизни меня я не могу выяснить, как удалить один из этих box_bricks из box_brick.instances - например, если бы я хотел удалить brick_60, так что это не больше в box_brick.instances, я не уверен, как бы я пошел Делать это.

Я пробовал делать brick_60.delete, delete (brick_60); и многое другое, но я полностью в тупике.

Любое руководство будет принята с благодарностью.

+1

Вы пробовали '.filter'? Как насчет '.splice'? – elclanrs

+0

Как может 'box_brick.instances.push (this);' даже работать, если его недействительный код? –

+0

@ Robert Rocha Предположительно, он инициализировал 'box_brick.instances'' '] где-то. –

ответ

0

Спасибо всем за помощь, - я обнаружил, что функция .splice(), предложенный elclanrs и данных, сделал именно то, что я надеялся. Я использую следующий код и он прекрасно работает:

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 как мой «главный список» всех фактических боксов, имеющих отношение к приложению, без учета автономных var (которые содержат ту же избыточную информацию).

Спасибо вам большое! Я погрузил много, много часов в это, прежде чем обратиться к StackOverflow, и руководство ваших ребят было именно тем, что мне было нужно.

+0

Я очень рад, что вы решили это решить, но я не могу не отметить, что этот ответ почти такой же, как и ответ, который я опубликовал неделю назад ... –

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

Есть ли какая-то особая причина '+ new Date()' не работать, и вы рекомендуете использовать jQuery? Кроме того, вам не нужно проверять членство перед удалением. –

+1

Время не уникально. Это не проблема для получения одинакового времени для двух разных вызовов функций. – zerkms

+0

@torazaburo вам не нужно его проверять. – zerkms

0

Поскольку массивы не индексируются в каком-либо конкретном путь, единственный способ сделать это будет путем итерации, чтобы найти кирпич, который вы хотите. Я мог бы порекомендовать изменить структуру данных как объект вместо массива, но следующее - это решение для получения того, что у вас есть.

Ниже приведена функция deleteID, которая будет перебирать и удалять элемент с определенным идентификатором. В следующем примере мы удаляем кирпич с 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/

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 
Смежные вопросы