Как грамотно реализовать код чистыми функциями?

152
25 октября 2021, 21:20

Нужно вывести узел с макс/мин значением.

Как это сделать чистыми функциями?
Как сделать рекурсивную функцию, чтобы она возвращала узел?

var obj={value:14,children:[{value:33,children:[{value:9,children:[{value:35},{value:69},{value:6}]},{value:47,children:[{value:4}]},{value:52,children:[{value:74},{value:55}]}]},{value:88,children:[{value:71,children:[{value:35}]},{value:6,children:[{value:74}]},{value:26,children:[{value:80},{value:42}]}]}]}; 
 
const minValue = obj => 
  Math.min(obj.value, ...(obj.children || []).map(minValue)); 
const maxValue = obj => 
  Math.max(obj.value, ...(obj.children || []).map(maxValue)); 
 
const showNode = obj => console.log(obj); 
const isRight = (obj, someValue) => obj.value === someValue; 
 
const req = objItem => { 
  (objItem.children || []).map(req); 
  if (isRight(objItem, minValue(obj))) { 
    showNode(objItem); 
  } 
  if (isRight(objItem, maxValue(obj))) { 
    showNode(objItem); 
  } 
}; 
 
req(obj); 
 
//console.log(maxNode(obj)); 
//console.log(minNode(obj));

Answer 1

Для вывод узла - не обязательно сначала искать значение, а потом по значению опять искать узел. Достаточно сразу возвращать узел целиком, а не одно его поле.

Например:

var obj={value:14,children:[{value:33,children:[{value:9,children:[{value:35},{value:69},{value:6}]},{value:47,children:[{value:4}]},{value:52,children:[{value:74},{value:55}]}]},{value:88,children:[{value:71,children:[{value:35}]},{value:6,children:[{value:74}]},{value:26,children:[{value:80},{value:42}]}]}]}; 
 
const minNode = obj =>{ 
  const minChild = (obj.children||[]).map(minNode).reduce((a,b)=>a.value<b.value?a:b,{value:Infinity}); 
  return obj.value < minChild.value ? obj : minChild;   
}; 
const maxNode = obj =>{ 
  const maxChild = (obj.children||[]).map(maxNode).reduce((a,b)=>a.value>b.value?a:b,{value:-Infinity}); 
  return obj.value > maxChild.value ? obj : maxChild;   
} 
 
 
console.log(maxNode(obj)); 
console.log(minNode(obj));

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

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

Я ожидаю что когда массив пустой он будет показывать Hello worldНо он этого не делает

186
Блок стрелка с использованием SVG

Блок стрелка с использованием SVG

Мне нужно нарисовать красивую заштрихованную стрелку блока, используя SVG из одной точки (x0, y0) в другую (x1, y1), как показано на рисунке

112
Как получить все блоки?

Как получить все блоки?

Есть разметка вида:

209
Задержка при переборе каждого блока

Задержка при переборе каждого блока

На странице есть несколько блоков, я прохожусь по каждому с помощью кода:

110