javascript - 总结给定级别的树(嵌套对象)

标签 javascript recursion javascript-objects

我有一棵嵌套对象树(3层,代表建筑物、楼层、房间)。叶节点包含房间区域。我想在给定级别(动态提供)总结该区域,而不改变源数据。

const data = {
  building1: {
    floor1: {
      room1: {
        area: 0.1,
      },
      room2: {
        area: 0.2,
      }
    },
    floor2: {
      room1: {
        area: 0.3,
      },
      room2: {
        area: 0.4,
      }
    }
  },
  building2: {
    floor1: {
      room1: {
        area: 0.15,
      },
      room2: {
        area: 0.25,
      }
    },
    floor2: {
      room1: {
        area: 0.35,
      },
      room2: {
        area: 0.45,
      }
    }
  },
  level: 3
};

例如,我需要一个 1 级(建筑物级别)摘要来返回一个如下所示的新对象:

{
  building1: {
      area: 1
  },
  building2: {
      area: 1.2
  }
}

我希望能够获得如下所示的 2 级摘要:

{
  building1: {
    floor1: {
      area: 0.3
    },
    floor2: {
      area: 0.7
    }
  },
  building2: {
    floor1: {
      area: 0.4
    },
    floor2: {
      area: 0.8
    }
  }
}

累加只是简单的算术和。我可以获取树中任何节点的摘要(组合区域),但不确定如何克隆源数据并用摘要替换所需级别的数据。

const addAreas = (op1, op2) => ({
  area: op1.area + op2.area
})

const traverseNodeToArea = node => {
  return Object.entries(node).map(([key, val]) =>
    val.hasOwnProperty('area')
      ? val
      : traverseNodeToArea (val)
  ).reduce(addAreas,{
    area: 0
  });
};

如果有帮助的话,很高兴使用 lodash。我确信一定有一个简单的解决方案,但我就是看不到。

(traverseNodeToArea 基于 this answer )

最佳答案

您可以使用级别计数器,如果级别为零,则获取剩余嵌套区域的总和。

function getSummary(object, level) {
    const getSumOfArea = object => Object.entries(object).reduce((r, [k, v]) => r + (k === 'area' ? v : getSumOfArea(v)), 0);

    if (!object || typeof object !== 'object')
        return object;

    if (level)
        return Object.assign(...Object.entries(object).map(([k, v]) => ({ [k]: getSummary(v, level - 1) })));

    return { area: getSumOfArea(object) };
}

const data = { building1: { floor1: { room1: { area: 0.1, }, room2: { area: 0.2, } }, floor2: { room1: { area: 0.3, }, room2: { area: 0.4, } } }, building2: { floor1: { room1: { area: 0.15, }, room2: { area: 0.25, } }, floor2: { room1: { area: 0.35, }, room2: { area: 0.45, } } }, level: 3 };

console.log(getSummary(data, 0));
console.log(getSummary(data, 1));
console.log(getSummary(data, 2));
console.log(getSummary(data, 3));
.as-console-wrapper { max-height: 100% !important; top: 0; }

关于javascript - 总结给定级别的树(嵌套对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53888069/

相关文章:

javascript - 为什么我的数组在 Javascript 中将自身分开?

javascript - 为什么从 Angular 服务中的对象中删除此元素不起作用?

javascript - 如何从对象中过滤掉键?

javascript - ForEach 内部 API 无法正常工作

javascript - 为什么这里的 apply() 只接受一个参数而不是两个?

javascript - 传递给initialPreview属性的<img>标签数组

Haskell - 无法将预期类型 ‘b’ 与实际类型 ‘a’ 匹配

c++ - 迭代/递归

javascript - 如何动态地将对象添加到对象的属性中?

javascript - 是否可以使用 JavaScript 连接到 SSH?