【问题标题】:How to set JavaScript object's property value?如何设置 JavaScript 对象的属性值?
【发布时间】:2019-03-24 15:19:30
【问题描述】:

我有一个看起来像这样的 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;

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

【问题讨论】:

  • 如果长度不大于或等于2则返回可能¯_(ツ)_/¯
  • 你还能做什么?如果属性参数的长度不大于等于2,你希望做什么?
  • 我不确定我是否明白。如果您知道属性名称和值是什么,您可以使用点符号来设置值:obj.state.quit = false。直接访问对象不能执行的函数是什么?
  • 为什么不只是obj['person']['male'] = false
  • 我希望 updateObj(['game','settings','ver'], 11 )updateObj(['next'], 100 ) 也能正常工作

标签: javascript properties attributes


【解决方案1】:

下面的方法会达到你的效果,下面使用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 );

【讨论】:

  • 为什么反向然后使用reduceRight,而不是仅仅使用reduce?
  • 为什么要反转两次?
  • 是的@MarekKnows.com 它首先用 reduceRight 打动了我,后来才意识到我也可以这样做 prop.reduce((o, d, i) => i == prop.length -1 ? (o[d] = value): o[d] , obj)
【解决方案2】:

遍历属性部分并为每个部分获取嵌套对象:

function updateObj( property /*: string[]*/, value /*: any*/ ) {
    var base = obj;
    for (var i = 0; i < property.length - 1; i++) {
        base = base[property[i]];
    }
    base[property[property.length - 1]] = value;
}

【讨论】:

    【解决方案3】:

    您可以保存最后一个键并通过获取键并返回最后一个对象引用来减少对象。对于未给定的属性,分配一个空对象。

    最后取出最后一个键并赋值。

    function updateObj(properties, value) {
        var last = properties.pop();
        properties.reduce((o, k) => o[k] = o[k] || {}, obj)[last] = value;
    }
    
    var obj = { person: { male: true, age: 10 }, state: { quit: false, rain: -3 }, game: { settings: { lang: 'en', os: 'win', ver: 10 }, }, next: 55, last: 10 };
    
    updateObj(['person', 'male'], false);
    updateObj(['state', 'rain'], 19);
    updateObj(['banana', 'ware'], 'snakeoil');
    
    
    console.log(obj);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      猜你喜欢
      • 2021-07-19
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2015-03-14
      • 2019-07-20
      • 2018-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多