#javascript #arrays #reactjs #javascript-objects
Вопрос:
Я создаю интернет — магазин. Продукт имеет атрибуты (в данном случае компьютер iMac имеет такие атрибуты, как емкость, функции usb и цифровая клавиатура). Я храню атрибуты в своем состоянии.
Проблема в том, что каждый раз, когда я переключаюсь, например, с емкости 256 ГБ на емкость 512 ГБ, он добавляет в массив совершенно новый объект {capacity:"512GB"}
.
Как настроить функцию обработчика (код ниже) таким образом, чтобы она условно проверяла, есть ли у объекта в массиве уже ключ «Емкость», и обновляла его до нового выбора вместо добавления другого объекта? Я перепробовал все, я в отчаянии
обработчик получает объект с парой ключ-значение, а также сам ключ (как label
) и тип. В этом случае тип можно игнорировать.
const handleAttributeChange = (object, type, label) =gt; { if (type == "text") { this.setState({ selectedAttributes: { id: id, text: [...this.state.selectedAttributes.text, object], swatch: this.state.selectedAttributes.swatch, }, }); } else if ((type = "swatch")) { this.setState({ selectedAttributes: { id: id, text: this.state.selectedAttributes.text, swatch: [...this.state.selectedAttributes.swatch, object], }, }); } };
Комментарии:
1. Вам следует рассмотреть возможность использования объекта вместо массива для хранения атрибутов, так как объект уже имеет уникальные ключи.
Ответ №1:
Вместо массива вы можете использовать объекты со значениями ключей diff. Если ключи уникальны. Позже вы сможете преобразовать его в список значений.
let obj = {}; const update = (o) =gt; { obj = { ...obj, ...o }; }; /* In case you know key, value */ const update2 = (key, value) =gt; { obj[key] = value; }; console.log(obj); update({ a: 1 }); update({ b: 2 }); console.log(obj); // { a: 1, b: 2 } update({ a: 3 }); console.log(obj); // { a: 3, b: 2 } console.log(Object.entries(obj).map(([key, value]) =gt; ({ [key]: value }))); //[ { a: 3 }, { b: 2 } ]
Комментарии:
1. Прекрасный пример неуместного дублирования. Если вы обновляете объект на месте, промежуточная копия только загромождает сборщик мусора. И код тоже более сложный.