Как эффективно удалять элементы из ассоциативного массива, используя синтаксис распространения - PullRequest
0 голосов
/ 24 мая 2019

Я работаю над проектом, использующим jQuery и KendoUI для jQuery, и мне нужно создать метод для удаления элементов, обновив его, а не изменяя объект.

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

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

deleteOption: option => {
                const { option, ...rest } = P.Order.Payment.get("paymentMethods");
                P.Order.Payment.set("paymentMethods", rest);
              }

Мой массив состоит из объектов, которые однозначно идентифицируются атрибутом uid.

Объект в массиве создается так:

addNewCard: () => {
                P.Order.Payment.addOption(
                    {
                      paymentName: "Kort",
                      type: "CC",
                      value: 0,
                      class: "form-control",
                      icon: "fal fa-credit-card",
                      validated: true,
                      uid: this.uid,
                      update: (values) => {
                        P.Order.Payment.updateOption(this, values);
                      },
                      rmItem: function(){
                        P.Order.Payment.subtractValue(this.uid);
                        P.Order.Payment.deleteOption(this);
                      }
                    }
                );
              },

РЕШЕНИЕ:

Предложения, приведенные ниже, ПОЛУЧИЛИ меня там, где мне было нужно, но в качестве аргумента, который я получаю, это объект, а не строка, мне нужен строковый идентификатор, чтобы использовать их. Поскольку объект в моем случае всегда является частью индексированного массива, хотя я мог использовать индекс в качестве своего идентификатора, мне также пришлось настроить метод set, чтобы правильно объединить оставшийся индексированный массив, не затрагивая ассоциативную часть массива, содержащую функции Kendo.

deleteOption:  option => {
  const index = P.Order.Payment.get("paymentMethods").indexOf(option);
  let { [index]: _, ...rest } = P.Order.Payment.get("paymentMethods");
  rest = Array.from(rest).filter(entry => entry === undefined || null);
  P.Order.Payment.set("paymentMethods", [ ...rest ]);
},

Это решение решило мою проблему, я думаю, что оно достаточно чистое, но в нем должно быть место для оптимизации при использовании вне KendoUI.

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Если вы хотите удалить ключ переменной option, вам нужно вычисляемое свойство с фиктивной переменной.

deleteOption: option => {
    const { [option]:_, ...rest } = P.Order.Payment.get("paymentMethods");
    P.Order.Payment.set("paymentMethods", rest);
}
1 голос
/ 24 мая 2019

Вам необходимо использовать вычисленное имя свойства:

deleteOption: option => {
    const { [option]: option, ...rest } = P.Order.Payment.get("paymentMethods");
    P.Order.Payment.set("paymentMethods", rest);
}
...