2017-01-07 3 views
0

У меня есть следующие функции:Удалить один объект из JS массива

private removeOneCard(id) { 
    this.cards = this.cards.filter(
    card => card.id != id); 
} 

Какой я был в состоянии отфильтровать все объекты, которые имеют тот же идентификатор. Проблема в том, что у меня есть несколько объектов с одним и тем же идентификатором (для карточной игры). Вместо того, чтобы делать дубликаты всех карточек, я просто отслеживаю, сколько из того же типа все еще находятся в колоде и в руках людей.

Как я могу сказать, что эта функция фильтрует только одну из карт с одинаковым идентификатором? Как и в, найдите карточку с идентификатором 5, вырежьте это из моей руки, затем держите все остальные карты в руке?

+2

Я бы сказал, что у вас проблемы с логикой. Если у вас есть список объектов независимо от того, как вы показываете его для пользователей, но для вас (разработчика) каждый элемент должен иметь уникальный идентификатор. Это спасет вас от множества проблем в будущем. –

+0

Это справедливо, я полагаю ... Это не для клиента или всего лишь для быстрой и грязной вещи. – Jeff

ответ

1

К сожалению, я не думаю, что есть Array.prototype функция, которая выполняет то, что вы хотите.

Это, вероятно, самый сжатый декларативный подход.

private removeOneCard(id) { 
    // Grab the index of the first card whose ID matches the input ID 
    const removeIdx = this.cards.findIndex((card) => card.id === id); 
    // Remove that index from the array 
    this.cards = this.cards.filter((card, idx) => idx !== removeIdx); 
} 
+0

Просто попробовал это. Отлично. Благодарю. – Jeff

3

Вы можете разделить его на 2 этапа:

  1. Найти индекс первого вхождения.

  2. удалить объект

Demo:

// Find index 
var index = cards.findIndex(function (c) { 
    return c.id === cardId; 
}) 

// Remove if exists 
if (index >= 0) { 
    cards.splice(index, 1) 
} 

JSFiddle Example

Смежные вопросы