按父实体和虚线路径列出的实体列表

Entity list by parent entity and dotted paths

我正在使用 Angular 5 + Breeze JS + breeze-bridge2-angular.

假设我们有一个 Company 实体,它具有 Address 类型的多个导航属性,并且 Address 实体类型本身具有一些导航属性,例如 Country, 等等:

import { Entity } from "breeze-client"; // From https://www.npmjs.com/package/breeze-client package 

export class Company implements Entity {
    billingAddress: Address;
    shippingAddress: Address;
}

export class Address implements Entity {
    country1: Country;
    country2: Country;
}

export class Country implements Entity {
    ...
}

所有实体都已经查询到EntityMnager,不需要从服务器查询任何东西。

如何实现一个方法(可能使用一些 Breeze JS API 到目前为止我还没有找到) 采用父 Company 实体和 string[] 的虚线 属性 路径和 returns 平面 Entity[] 列表包含父实体和使用这些虚线路径定位的所有子实体?

虚线路径与我们在 Breeze 查询中使用 expand() 方法相同(参见 虚线展开路径 here),即:

const company: Company = ...; // Query Company and its children into EntityManager
const paths: string[] = [
    "billingAddress",
    "shippingAddress",
    "billingAddress.country1",
    "billingAddress.country2"];

getEntitiesFlat(entity: Entity, paths: string[]): Entity[] {
    // Not sure how to implement getChildren() method below
    const childEntities: Entity[] = this.getChildren(entity, paths);

    return [entity].concat(childEntities);
}

顺便说一句,我正在尝试删除父实体及其 特定的 子实体,以上是迄今为止我所想到的最简洁的方法开发力量框架。非常欢迎更好的想法。

不是真的确定你在找什么。假设您正在使用 path 并将这些路径映射到 entity 对象...我想出了:

function getByPath(entity: any, path: string) {
  if (!entity) return undefined

  const parts = path.split(".")

  if (parts.length === 1) {
    return entity[path]
  }

  return getByPath(entity[parts[0]], parts.slice(1).join("."))
}

喜欢

const paths = ["a", "a.b.c", "a.b.d", "d", "c", "d.c"]
const entity = {
  a: { b: { c: 1 } },
  b: 1,
  c: 2
}

paths.map(path => getByPath(entity, path)) // [ { b: { c: 1 } }, 1, undefined, undefined, 2, undefined ]

编辑:如果您已经在使用 lodash,只需使用 lodash#get