首页 > 解决方案 > 如何设置 JavaScript 对象的属性值?

问题描述

我有一个看起来像这样的 JavaScript 对象:

obj = {
  person: {
    male: true,
    age: 10
  },
  state: {
    quit: false,
    rain: -3
  },
  game: {
     settings: {
       lang: 'en',
       os: 'win',
       ver: 10,
     },
  },
  next: 55,
  last: 10,
};

我想创建一个可用于设置任何 obj 值的函数,如下所示:

function updateObj( property /*: string[]*/, value /*: any*/ ) {

  obj[property[0]][property[1]] = value;  <-- How to generalize? 

}

那么我可以做这样的事情:

updateObj( ['person', 'male'], false );
updateObj( ['state', 'rain'], 19 );

但是,如果属性参数长度不等于 2,则当前实现将无法正常工作。这行代码如何:

  obj[property[0]][property[1]] = value;

可以推广到任何数组大小的属性?

标签: javascriptpropertiesattributes

解决方案


下面的方法将达到你的结果,使用reduceRight下面

// with reduceRight
function updateObj(prop, value) {
    prop  = prop.reverse()
    prop.reduceRight((o, d, i) => i == 0 ? (o[d] = value): o[d] , obj)
}

// with Reduce (efficient than above)
function updateObj(prop, value) {
    prop.reduce((o, d, i) => i == prop.length -1 ? (o[d] = value): o[d] , obj) 
}

updateObj( ['person', 'male'], false );
updateObj( ['state', 'rain'], 19 );

推荐阅读