如何在对象内部及外部引用对象中的数组值?
解决对象数组取值的两种场景问题
咱们直接针对你提到的两个场景来梳理解决方案:
场景一:同一对象内部引用自身键对应的值
你原来的代码里写了x: this.N[2],这里有个坑:在对象字面量初始化的过程中,this并不会指向当前正在创建的direction对象,所以这么写要么拿到undefined,要么直接报错(比如在严格模式下)。
给你两种可行的解决办法:
方法1:先创建对象,再补充属性
如果你的N[2]的值是固定不变的,这种方式最简单直接:
const direction = { 'N': ['E', 'W', 0], 'E': ['S', 'N', 0], 'S': ['W', 'E', 0 * Math.sign(-1)], 'W': ['N', 'S', 0 * Math.sign(-1)] }; // 此时direction已经创建完成,直接引用它的属性赋值 direction.x = direction.N[2];
方法2:使用getter函数动态获取
如果N[2]的值后续可能会变化,想要x始终同步最新值的话,用getter是更好的选择:
const direction = { 'N': ['E', 'W', 0], 'E': ['S', 'N', 0], 'S': ['W', 'E', 0 * Math.sign(-1)], 'W': ['N', 'S', 0 * Math.sign(-1)], // 定义getter,每次访问x时都会执行这个函数 get x() { return this.N[2]; // 这里的this已经指向direction对象了 } }; // 后续修改N[2]的话,x会自动更新 direction.N[2] = 10; console.log(direction.x); // 输出10
场景二:在另一个对象中引用目标对象的键值
你写的const value = { x: direction.N[2]}本身是没问题的,但要注意一个前提:direction必须在value之前被声明并初始化,否则会因为direction未定义而报错。
基础写法(值固定)
如果不需要动态同步,直接引用即可:
// 先定义好direction对象 const direction = { 'N': ['E', 'W', 0], 'E': ['S', 'N', 0], 'S': ['W', 'E', 0 * Math.sign(-1)], 'W': ['N', 'S', 0 * Math.sign(-1)] }; // 再创建value对象,直接引用direction的属性 const value = { x: direction.N[2] }; // 此时value.x为0
动态同步写法
如果希望value.x能跟着direction.N[2]的变化而更新,同样可以用getter:
let direction = { 'N': ['E', 'W', 0], 'E': ['S', 'N', 0], 'S': ['W', 'E', 0 * Math.sign(-1)], 'W': ['N', 'S', 0 * Math.sign(-1)] }; const value = { get x() { return direction.N[2]; } }; // 修改direction的属性后,value.x会自动更新 direction.N[2] = -5; console.log(value.x); // 输出-5
内容的提问来源于stack exchange,提问作者Yappyhappy
相关产品推荐
相关产品推荐

