按父实体和虚线路径列出的实体列表
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
我正在使用 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