Форум программистов, компьютерный форум, киберфорум
JavaScript: ReactJS
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 04.02.2020
Сообщений: 12
1

Почему не работает удаление из массива?

20.07.2022, 21:41. Показов 753. Ответов 1

Author24 — интернет-сервис помощи студентам
При удалении элемента из массива, почему-то всегда удаляется последний элемент. Пробовал разными способами: фильтром и через slice. Никак не могу понять почему так происходит.


Parent component
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import { useState } from "react";
import "./styles.css";
import TableRow from "./TableRow";
export default function App() {
  const [row, setRow] = useState([]);
  const deleteRow = (index) => {
    const newArray = [...row.slice(0, index), ...row.slice(index + 1)];
    setRow(newArray);
  };
  const addRow = () => {
    setRow([...row, <TableRow />]);
  };
 
  return (
    <div className="app">
      <div>
        <table>
          <thead>
            <tr>
              <th>ФИО</th>
              <th>Должность</th>
              <th>Возраст</th>
              <th>Компетенции</th>
              <th> </th>
            </tr>
          </thead>
 
          <tbody>
            {row.map((item, index) => (
              <TableRow
                deleteRow={deleteRow}
                index={index}
                key={index}
                item={item}
              />
            ))}
          </tbody>
        </table>
        <div className="container">
          <div onClick={addRow}>Добавить</div>
        </div>
      </div>
    </div>
  );
}
child component
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import "./styles.css";
 
const TableRow = ({ deleteRow, index }) => {
  return (
    <tr>
      <td>
        <input name="name" type="text" placeholder="dasda" />
      </td>
      <td>
        <select name="select">
          <option value="analyst">Аналитик</option>
          <option value="manager">Менеджер</option>
          <option value="programmer">Программист</option>
          <option value="lawyer">Юрист</option>
        </select>
      </td>
      <td>
        <input name="age" type="number" placeholder="asdadsa" />
      </td>
      <td>
        <textarea
          name=""
          id=""
          cols="25"
          rows="3"
          style={{ resize: "none" }}
        ></textarea>
      </td>
      <td className="delete-row" onClick={() => deleteRow(index)}>
        {" "}
        удалить{" "}
      </td>
    </tr>
  );
};
 
export default TableRow;
CSS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
.header {
  text-align: center;
  margin-bottom: 50px;
  margin-top: 10px;
}
 
.header__input {
  padding: 3px 0 3px 20px;
}
 
.container {
  width: 70%;
  display: flex;
  justify-content: space-around;
  cursor: pointer;
}
 
table {
  margin-bottom: 10px;
  width: 70%;
  border: 1px solid black;
  border-collapse: collapse;
  position: relative;
}
 
table thead th {
  padding: 10px 0;
  border-left: 1px solid black;
}
 
table td {
  text-align: center;
}
 
table tbody td {
  border: 1px solid black;
  vertical-align: top;
  padding: 5px;
}
 
table tbody tr {
  position: relative;
}
 
table tbody tr {
  position: relative;
}
 
table tbody tr td:last-child {
  border: none;
}
 
.delete-row {
  position: absolute;
  content: "-";
  top: 30%;
  right: -10%;
  cursor: pointer;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2022, 21:41
Ответы с готовыми решениями:

Не работает удаление пробелов в строке! Подскажите пожалуйста, почему не работает?
Здравствуйте! Скажите пожалуйста, почему не работает данный код; должно брать строку, которую ввёл...

Почему неправильно работает удаление символов из строки?
const g=; var s : string; i : integer; d : integer; begin readln (s); d := length (s);...

Почему не работает удаление для нулевого элемента списка?
procedure Delete(var L:link; i:integer); var k:integer; p, q:link; begin k:=0;...

Действия с одномерным массивом. Не работает удаление из массива
Программа ещё не дописана, есть только формирование и печать массива, удаление не работает из - за...

Почему не работает обход массива?
Что я делаю не так? int **mas = new int*; for (int i=0; i&lt;5; i++) { for (int j=0; j&lt;5;...

1
молодой
1641 / 905 / 291
Регистрация: 17.07.2021
Сообщений: 1,850
Записей в блоге: 12
21.07.2022, 00:30 2
Лучший ответ Сообщение было отмечено mr_dramm как решение

Решение

Цитата Сообщение от Bivis3000 Посмотреть сообщение
почему-то всегда удаляется последний элемент.
учитывая что вы везде работаете с индексами, у вас просто массив становится на один элемент короче, и не важно что вы удалил элемент в начале или в конце

и в TableRow вы также передаете index, а item просто не используется

Javascript
1
TableRow = ({ deleteRow, index })
а индексы у массивов всегда последовательные нельзя удалить индекс

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
const row = Array.from(Array(4), (x, index) => index + 1) //[ 1, 2, 3, 4 ]
const deleteRow = (index) => {
 
    const newArray = [...row.slice(0, index), ...row.slice(index + 1)];
    // состояние до удаления 
    console.log(row) //[ 1, 2, 3, 4 ] - это значения элементов массива, у значений есть индексы которые начинаются с 0 и идут всегда последовательно, т.е. значения индексов такие [ 0, 1, 2, 3 ]
    // используем item
    console.log(newArray.reduce((arr, item) => (arr.push(item), arr), [])) // [ 1, 3, 4 ] - тут видно удалил элемент под индексом 1 со значением 2
    // используем index
    console.log(newArray.reduce((arr, _, index) => (arr.push(index), arr), [])) // [ 0, 1, 2 ] - тут видно как индексы всегда последовательно возрастают, и в данном случае кажется что мы удаляем последний элемент, хотя на самом деле мы удалили элемент с индексом 1
};
deleteRow(1)
0
21.07.2022, 00:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2022, 00:30
Помогаю со студенческими работами здесь

Почему не работает переменная из массива?
Столкнулся с такой дичью. Делаем так и ничетра не работает: $ratio_1 = $current_ratios -&gt;...

Удаление всех четных элементов из массива (программа не работает)
Доброго времени суток, не работает такая вот конструкция для &quot;удаления&quot; нечетных элементов из...

Почему не работает код перевертывания массива?
Помогите пожалуйста новичку рабобраться. У меня задание следующее: создать массив, для которого...

Объяснить почему не работает заполнение массива
#include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;fstream&gt; #include &lt;string&gt; #include &lt;stdlib.h&gt;...

Почему не работает произведение столбца массива?
Требуется найти произведение 1 столбца массива. Где допустим ошибку ? using System; ...

Почему не работает программа реверса массива
#include&lt;stdlib.h&gt; #include&lt;stdio.h&gt; #define N 5 int main() { int arr, max, j, temp; int * a,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru