Найти минимальное и максимальное значения во вложенном объекте - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть глубоко вложенный объект javascript с неограниченным количеством детей. У каждого ребенка есть значение.

var object = {
     value: 1,
     children: {
      value: 10,
      children:{
       value: 2,
       children: {...}
      } 
     }
}

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

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Коротко и просто, для минимального изменения Math.max на Math.min

var test = {
   value: 1,
   children: {
    value: 10,
    children:{
      value: 2,
      children: {}
    }
   }
}
function findMaxValue(obj) {
  if (Object.keys(obj.children).length === 0) {
    return obj.value;
  }
  return Math.max(obj.value, findMaxValue(obj.children))
}
console.log(findMaxValue(test))
0 голосов
/ 19 ноября 2018

Поскольку children - это объект только с одним значением (против массива с потенциально большим числом), это довольно простая рекурсивная функция. Базовый случай - это когда дочерних элементов нет, и в этом случае значения min и max являются только значением. В противном случае на детей наберите минимальное и максимальное значения:

var object = {
  value: -10,
  children: {
   value: 4,
   children:{
    value: 200,
    children: {
      value: -100,
      children: null
    }
   } 
  }
}

function getMinMax(obj) {
  if (!obj.children || obj.children.value == undefined)
     return {min: obj.value, max: obj.value}
  else {
    let m = getMinMax(obj.children)
    return {min: Math.min(obj.value, m.min), max: Math.max(obj.value, m.max)} 
  }
}

console.log(getMinMax(object))
0 голосов
/ 19 ноября 2018

После объединения вашего связанного списка в массив, вы можете использовать Array.prototype.reduce() с аккумулятором, который является кортежем min и max, начиная с начальных значений Infinity и -Infinity соответственно, чтобы соответствовать реализациям Math.min() и Math.max():

const object = {
  value: 1,
  children: {
    value: 10,
    children: {
      value: 2,
      children: {
        value: 5,
        children: null
      }
    }
  }
}

const flat = o => o == null || o.value == null ? [] : [o.value, ...flat(o.children)]
const [min, max] = flat(object).reduce(
  ([min, max], value) => [Math.min(min, value), Math.max(max, value)],
  [Infinity, -Infinity]
)

console.log(min, max)
...