Как отсортировать данные в порядке asc и desc в таблице - PullRequest
0 голосов
/ 05 марта 2019

Я новичок, чтобы реагировать JS.Здесь я пытаюсь отсортировать данные, когда пользователь нажимает на значки.

<th scope="col">Technology <i className="fa fa-fw fa-sort sort-icon"></i></th>

Итак, теперь у меня есть данные в виде массива объектов.

Вэто, у меня есть 5 столбцов и значок сортировки на каждом столбце.Итак, как мне реализовать эту вещь, используя реагировать?

Я хочу отсортировать по алфавиту.

Мои данные выглядят так:

[{
        "id": "5b7d4a566c5fd00507501051",
        "hrmsJdId": null,
        "companyId": null,
        "jdName": "Senior/ Lead UI Developer",
        "jobDescription": null,
        "technology": java,
    }, {
        "id": "5b7fb04d6c5fd004efdb826f",
        "hrmsJdId": null,
        "companyId": null,
        "jdName": "Content Innovation Lead",
        "jobDescription": null,
        "technology": css
    }, {
        "id": "5b7fb0b26c5fd004efdb8271",
        "hrmsJdId": null,
        "companyId": null,
        "jdName": "Urgent Opening for DSP Engineer/ Senior Engineer for",
        "jobDescription": null,
        "technology": react,
    }]

 <td>{item.technology}</td>
                <td>17</td>
                <td title={item.jdName} className="jd-name-container justify-content-center align-items-center">
                  <div className="jdName">{item.jdName}</div>
                  {(key + 1 === 1) && <div className="badge new-badge badge-warning-custom">New</div>}
                </td>

Вот какЯ представляю данные.Теперь

По умолчанию я сортирую его, используя

   <tbody className="text-center">
          {props.jobList && props.jobList && props.jobList.length > 0 && props.jobList.sort((a, b) => b.createdAt - a.createdAt).map((item, key) => {
            return (
              <tr key={key}>
                <td align="center"> <input type="checkbox" name="myTextEditBox" value="checked" /></td>
                <td>{item.technology}</td>
                <td>17</td>
                <td title={item.jdName} className="jd-name-container justify-content-center align-items-center">
                  <div className="jdName">{item.jdName}</div>
                  {(key + 1 === 1) && <div className="badge new-badge badge-warning-custom">New</div>}
                </td>
                <td>30</td>
                <td>30</td>
                <td>
 </tbody>

Итак, как мне это реализовать?

То, что я сделал, это

<th scope="col">Technology<i className="fa fa-fw fa-sort sort-icon" onClick={props.sortAscending('Technology')}></i></th>

затем в контейнере

    sortData = (key,event) => {
        console.log("key is,", key);
        this.props.sortAscending(key);
      }

<UserJobsTabel jobList={filteredList} sortAscending={this.sortData} />

передается как подпорка.

Сейчас в действии,

export const sortAscending = (type) => {
  return {
    type: "SORT_ASCENDING",
    payload: type
  }
}

В редукторе,

case FETCHING_JOBDESCRIPTION_SUCCESS:
            return {
                ...state,
                jobList: action.data.jobData ? action.data.jobData.sort((a, b) => b.createdAt - a.createdAt) : action.data.jobData,
                yesterDayScore: action.data.yesterdayScore,
                todayScore: action.data.todayScore,
                error: false,
            }

 case "SORT_ASCENDING": 
          const { sortKey } = action.payload;
            const jobList = [ ...state.jobList ]
        .sort((a, b) => a[sortKey].localeCompare(b[sortKey]));
      return { ...state, jobList };

×

Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.

Я получаю эту ошибку.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Используйте localeCompare() для сортировки в алфавитном порядке.

Выполните сортировку в редукторе, пока компонент просто отправляет действие "сортировка".Каждая повторная сортировка приведет к обновлению компонента для jobList propmapStateToProps).

В редукторе:

const initialState = {
  jobList: [],
};

export const jobList = (state = initialState, action) => {
  switch(action.type) {
    case Action.SORT_ALPHA_ASC:
      const { sortKey } = action.payload;
      const jobList = [ ...state.jobList ]
        .sort((a, b) => a[sortKey].localeCompare(b[sortKey]));

      return { ...state, jobList };

    default:
      return state;
  }
}

В вашем компоненте:

// alphaSort will dispatch action: SORT_ALPHA_ASC
const { jobList, alphaSort } = this.props;
if (! jobList || jobList.length < 1) {
  // no job list
  return null;
}

return (
<table>
  <thead>
    { /* TODO: use th/td */ }
    <SomeIcon name='asc-technology' onClick={() => alphaSort('technology')} />
    <SomeIcon name='asc-jdname' onClick={() => alphaSort('jdName')} />
    { /* TODO: other fields */ }
  </thead>
  <tbody>
  {
    jobList.map((job) => ({
      <tr key={job.id}>
        <td name="technology">{job.technology}</td>
        <td title={job.jdName}>
          <div className="jdName">{job.jdName}</div>
        </td>
        { /* TODO: other fields */ }
      </tr>
    }))
  }
  </tbody>
</table>
);

ПРИМЕЧАНИЕ : сортировка по убыванию и другие поля будут для продолжения OP.:)

0 голосов
/ 05 марта 2019

Массивы React Js имеют функцию сортировки:

['b', 'a'].sort((e1, e2) => e1.id < e2.id  ? 1 : - 1)

Если лямбда-функция возвращает 0, она ничего не делает.В противном случае два элемента в массиве будут отсортированы по признаку возвращаемого значения.

Если в базе данных есть повторяющиеся идентификаторы, функция вернет 0.

Чтобы поменять порядокизмените либо знак возвращаемого значения, либо оператор «меньше чем» на оператор больше чем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...