在嵌套对象中找到最小值和最大值

时间:2018-11-19 16:38:26

标签: javascript reduce

我有一个深度嵌套的javascript对象,其中包含无数子项。每个孩子都有价值。

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

所有创建递归函数的尝试均未成功,结果仅下降到较低水平。

3 个答案:

答案 0 :(得分:3)

将链接列表展平为数组后,可以将enter image description here与一个累加器一起使用,该累加器是minmax的元组,其起始值是Infinity-Infinity分别匹配Array.prototype.reduce()Math.min()的实现:

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)

答案 1 :(得分:2)

由于children是一个只有一个值的对象(与一个可能有多个值的数组相比),因此这是一个非常简单的递归函数。基本情况是没有子级时的情况,在这种情况下,最小值和最大值均为值。否则,递归于孩子以找到最小值和最大值:

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))

答案 2 :(得分:1)

简洁明了,只需将{"a":1, "b":6, "c":3}更改为Math.max

Math.min