使用一段深层对象键作为局部变量

时间:2018-08-14 21:23:14

标签: javascript

我不知道这叫什么,但是,假设我有:

var object = {something:{really:{long:{x:2,y:3,z:null}}}};

//is there a way I can go like:

with (object.something.really.long) {
    z = x * y;
}

console.log(object);
//output: {something:{really:{long:{x:2,y:3,z:6}}}}

1 个答案:

答案 0 :(得分:0)

您的代码有效!甚至不需要任何更改。 但是,如MDN Docs所述,您应避免使用sealed trait Term case class Apply(func: Term, arg: Term) extends Term case class Lam(preferred: String, dom: Type, body: Term) extends Term case class BoundVar(deBruijnIdx: Int) extends Term case class FreeVar(name: String) extends Term sealed trait Type case object * extends Type case class Func(dom: Type, cod: Type) extends Type { override def toString = s"($dom -> $cod)" } import util.{Either, Left, Right} case class Ctx(globalConstants: Map[String, Type], stack: List[Type]) { def push(tp: Type): Ctx = Ctx(globalConstants, tp :: stack) def pop: Ctx = Ctx(globalConstants, stack.tail) } object Ctx { def empty = Ctx(Map.empty, List.empty) def emptyWithGlobals(keys: (String, Type)*) = Ctx(keys.toMap, Nil) } def tinf(t: Term, ctx: Ctx = Ctx.empty): Either[String, Type] = t match { case FreeVar(v) => ctx.globalConstants.get(v).map(Right(_)).getOrElse(Left("Undefined: " + v)) case BoundVar(d) => Right(ctx.stack(d)) case Apply(f, x) => for { tf <- tinf(f, ctx) tx <- tinf(x, ctx) res <- tf match { case Func(a, b) => if (tx == a) Right(b) else Left(s"Type mismatch: cannot apply `$a` to `$b`") case sthElse => Left(s"Not applicable: $sthElse") } } yield res case Lam(_, tp, b) => for { tb <- tinf(b, ctx.push(tp)) } yield Func(tp, tb) } for { example <- List( Lam("x", *, BoundVar(0)), Lam("x", *, Lam("y", Func(*, *), Apply(BoundVar(0), BoundVar(1)))) ) } println(example + " : " + tinf(example)) ,因为由于含糊不清,这很容易导致错误。

  

不建议使用with语句,因为它可能导致令人困惑的错误和兼容性问题。

     

不建议使用with,在ECMAScript 5严格模式下禁止使用。建议的替代方法是将要访问其属性的对象分配给临时变量。

此外,由于通过引用进行对象比较,因此对象比较将为false。无论如何,该对象看起来就像您最终说的一样。