Управление ключами на повторяющихся элементах в React

Одно горячее кодирование с помощью pandas очень просто:

def one_hot(df, cols):
    """
    @param df pandas DataFrame
    @param cols a list of columns to encode 
    @return a DataFrame with one-hot encoding
    """
    for each in cols:
        dummies = pd.get_dummies(df[each], prefix=each, drop_first=False)
        df = pd.concat([df, dummies], axis=1)
    return df

EDIT:

Другой способ one_hot использовать sklearn's LabelBinarizer:

from sklearn.preprocessing import LabelBinarizer 
label_binarizer = LabelBinarizer()
label_binarizer.fit(all_your_labels_list) # need to be global or remembered to use it later

def one_hot_encode(x):
    """
    One hot encode a list of sample labels. Return a one-hot encoded vector for each label.
    : x: List of sample Labels
    : return: Numpy array of one-hot encoded labels
    """
    return label_binarizer.transform(x)
4
задан olivarra1 15 January 2019 в 09:55
поделиться

2 ответа

Так как вы используете Fragment, я предполагаю, что вы используете версию> 16. В этом случае я думаю, что есть другой (возможно, лучший) способ решения этой проблемы, который возвращает массив массивов. Примерно так:

[
  [
    <div key='one'>foo</div>,
    <div key='two'>bar</div>,
  ],
  [
    <div key='one'>foo</div>,
    <div key='two'>bar</div>,
  ],
  [
    <div key='one'>foo</div>,
  ],
]

На самом деле это «эквивалентно» вашему «Решению B», но IMHO менее «хакерский», потому что я думаю , что Fragment не предназначен для использоваться таким образом. Позвольте мне остановиться на этом:

До версии 16 функция рендеринга не могла возвращать массив React Elements, что было довольно раздражающим. В версии 16 это стало возможным, однако элементы массива должны всегда иметь key, чтобы примиритель React работал должным образом, а это означает, что возвращать его из функции рендеринга плохо: это правильно:

[
  <span key="firstSpan">foo</span>,
  <span key="secondSpan">bar</span>,
] 

Но делать это немного странно и раздражает. Вот почему было изобретено Fragment, так что мы можем просто вернуть это:

<Fragment>
  <span>foo</span>
  <span>bar</span>
</Fragment>

Итак, большое преимущество Fragment состоит в том, что нам не нужно назначать keys их дочерним элементам , Вот почему я нахожу немного странным видеть Fragment с «ключами» детей.

Кроме того, я хотел сказать, что не думаю, что с вашим «вариантом А» что-то не так. Тем не менее, я думаю, что в большинстве случаев решение, которое я предлагаю, будет намного легче реализовать.

0
ответ дан Josep 15 January 2019 в 09:55
поделиться

Правильность использования в качестве ключа зависит от того, что может измениться в течение жизненного цикла родительского компонента (FillScreen).

Использование индекса в качестве ключа обычно не одобряется, потому что если items изменения реквизита в течение жизненного цикла FillScreen, то тот же индекс теперь может указывать на другой элемент, но компонент не будет повторно отображаться, потому что ключ остается тот же самый.

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

Аналогично, если вы вставляете элемент между массивом, то компоненты для представления всех последующих элементов будут отброшены и воссозданы.

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

<div class="fill-screen">
   <div key="one-0">foo</div>
   <div key="two-0">bar</div>
   <div key="one-1">foo</div>
   <div key="two-1">bar</div>
   <div key="one-2">foo</div>
   <div key="two-2">bar</div>
   <div key="one-3">foo</div>
</div>

Элементы React довольно легкие, поэтому клонирование не требует значительных накладных расходов.

0
ответ дан lorefnon 15 January 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: