JavaScript

Почему ругается интерпретатор JS

Const segment = { beginPoint: [ 3, 2 ], endPoint: [ 0, 0 ] };

const getMidpointOfSegment = (segment) => {
const {start : [x1, y1], end : [x2, y2]} = segment;
const middlePointOfSegment = [((x1 + x2)/2), ((y1 + y2)/2)];
return middlePointOfSegment;
};

Фото из редактора
Так работает:
{ start : [x1, y1], end : [x2, y2] } = { start : [3, 4], end : [5, 6] }
Так не работает:
{ start : [x1, y1], end : [x2, y2] } = { begin : [3, 4], end : [5, 6] }
Виктор Сазонов
Виктор Сазонов
58 065
Лучший ответ
Юрий Шестаков сonst answer = { beginPoint: [ 3, 2 ], endPoint: [ 0, 0 ] } ;

const getMidpointOfSegment = (segment) => {
const { start : [x1, y1], end : [x2, y2] } = segment;
const middlePointOfSegment = [((x1 + x2)/2), ((y1 + y2)/2)];
return middlePointOfSegment;
} ;

Я изменил названия переменных и ключей для большей наглядности.

Константа answer это результат работы другой функции. По этому и приходится для удобства упаковывать результат в, переменную а не передавать как безымянный объект в функцию getMidpointOfSegment.

Я не пойму почему ругается интерпретатор на то как я распаковываю segment. Переименование результата не меняет, все равно ругается.
Юрий Шестаков Посмотрите лучше здесь https://repl.it/join/vjxzpkfx-dvorobjevredsta , внесите корректировку и я ее увижу
Потому, что внутри функции у тебя распаковывается структура с полями start и end, а передаёшь ты структуру с полями beginPoint и endPoint

И зачем вообще такое переусложнение, если можно написать:

const getMidpointOfSegment = (seg) => {
return [(seg.beginPoint[0] + seg.endPoint[0]) / 2, (seg.beginPoint[1] + seg.endPoint[1]) / 2];
}

и это будет работать эффективнее твоего кода.
Александр Гаан
Александр Гаан
51 453
Юрий Шестаков сonst answer = { beginPoint: [ 3, 2 ], endPoint: [ 0, 0 ] } ;

const getMidpointOfSegment = (segment) => {
const { beginPoint : [x1, y1], endPoint : [x2, y2] } = segment;
const middlePointOfSegment = [((x1 + x2)/2), ((y1 + y2)/2)];
return middlePointOfSegment;
} ;

Я изменил названия переменных и ключей для большей наглядности.

Константа answer это результат работы другой функции. По этому и приходится для удобства упаковывать результат, в переменную а не передавать как безымянный объект в функцию getMidpointOfSegment.

Предложенный вами вариант будет работать, при условии если названия ключей будут неизменны. В моем варианте они могут поменяться, но структура объекта останется неизменной. {key : [x1, y1], key2 : [x2, y2]}. По этому я и использую деструктуризацию, а она выдает ошибку!
Юрий Шестаков Посмотрите лучше здесь https://repl.it/join/vjxzpkfx-dvorobjevredsta, так будет нагляднее и понятнее мне, что не так
Ошибку уже объяснили, еще дополню тем как это делают по уму:

1. Хелперы обязаны быть гибкими, предельно простыми за счет одиночной ответственности, и иметь адекватное имя:
const calcMidPoints = (...pts) => pts.map(
 ([[x1, y1], [x2, y2]]) => [(x1 + y1) / 2, (x2 + y2) / 2]
);

2. Контроль данных (или ассершн) должен быть обязательно:
const segment = await somewhere.getSegment();
const points = segment && [...Object.values(segment)];
assertPointsArr(points);  // бросает ошибку если данные факапнуты

3. Клиентский код должен быть читаем "по диагонали" - и пусть школота сколько угодно боится избыточной семантичности:
const midPoints = calcMidPoints([points]);
При этом, имен типа middlePointOfSegment следует избегать - так как, они как раз наоборот, снижают читаемость... вот это "OfSegment" должно быть и так понятно по контексту.

Ну и вообще, в продкоде хелперы обычно не отдельными функциями, а методами объекта состояния/сущности (крч, ООП).
Когда используется TS, ассершны не нужны - это уже вопрос характера, а не технической обоснованности (вот я предпочитаю чистый JS, а кто-то в себе настолько сомневается что без типизации даже по-большому сходить не может). Тесты, хотя бы интеграционные, нужны в любом случае: типизация или контроль выполнения это лишь половина обеспечения безопасности кода.
Иван Спиридонов >> calcMidPoints([points])
Тут надо calcMidPoints(points), естессно.
Ну или calcMidPoints([...points,‎ ‎...anotherPoints]) - если координаты >2D. Это так, к слову о гибкости хелперов.