我有一个深度嵌套的javascript对象,其中包含无数子项。每个孩子都有价值。
var object = {
value: 1,
children: {
value: 10,
children:{
value: 2,
children: {...}
}
}
}
所有创建递归函数的尝试均未成功,结果仅下降到较低水平。
答案 0 :(得分:3)
将链接列表展平为数组后,可以将与一个累加器一起使用,该累加器是min
和max
的元组,其起始值是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