【问题标题】:How to change the value of an object in all levels of keys?如何在所有级别的键中更改对象的值?
【发布时间】:2018-04-18 19:40:06
【问题描述】:

我想在所有对象级别更新对象的所有密码值:

let obj = {
  user: {
    name: 'u1', 
    password: 'do not show me'
  },
  subUsers: [
    {
      name: 'u2', 
      password: 'do not show me as well'
    }
  ],
  whereverLevel : {
    password: 'please, hide me too'
  }
}

updateDeeply(obj, 'password', '********') //mutates obj and changes all password values in all object levels.

有没有类似lodash _.set(...)的API方法?

【问题讨论】:

  • 你试过什么?递归搜索将是微不足道的。
  • 我在找lodash之类的api,没找到
  • 这几乎肯定是矫枉过正。这实际上只是对每个键/值对的迭代,递归到作为映射的每个 val,并替换任何具有“密码”键的 val。我认为您需要缩小这个问题的范围,因为它现在非常广泛。
  • 为什么你还要用纯英文的密码呢?你应该加密它们,然后这个问题似乎没有意义。
  • 如果绝对需要,您可以尝试将 obj 转换为 json 字符串,执行 'password:' 的正则表达式,然后这样做,但加密密码似乎是真正的答案。

标签: javascript node.js object


【解决方案1】:

简单的递归解决方案,处理对象和数组,改变输入——

function deepReplace ( x, targetKey, replaceWith ) {
    if ( Array.isArray( x ) ) {
        x.forEach( x => deepReplace( x, targetKey, replaceWith ) );
    } else if ( typeof x === 'object' ) {
        for ( var key in x ) {
            if ( key === targetKey ) x[ key ] = replaceWith;
            if ( typeof x[ key ] === 'object' ) {
                 deepReplace( x[ key ], targetKey, replaceWith );
            }
        }
    }
}

【讨论】:

    【解决方案2】:
     function* deepIterate(obj) {
      yield obj;
      for(const value of Object.values(obj)) 
       if(typeof value === "object")
         yield* deepIterate(value);
     }
    

    可以用作:

    for(const el of deepIterate(obj))
      if(el.password) el.password = "******";
    

    【讨论】:

    • 这很好!当值是一个数组时,我对它的工作原理感到困惑......你能详细说明一下吗?
    • 如果有人怀疑这是否有效,click here
    • @JonasW。这个解决方案在 babel transpiler 中可用吗?还是只在 nodejs 中?
    • 这是 ES6,所以如果你想支持 IE 和 Netscape,你应该使用 Babel :) 其他一切(nodejs 也是)应该支持它(除非你使用的是中世纪的版本)
    【解决方案3】:
    function updateKeys(keyName, value, input) {
      Object.keys(input).map(key => {
        if (key === keyName) {
          input[key] = value;
        } else if (Array.isArray(input[key])) {
          input[key].map(e => updateKeys(keyName, value, e));
        } else if (input[key] && input[key][keyName]) {
          input[key][keyName] = value;
        }
      });
    }
    

    https://repl.it/repls/AveragePalegreenFrontend

    【讨论】:

      【解决方案4】:
      let obj = {
          user: {
              name: 'u1',
              password: 'do not show me'
          },
          subUsers: [
              {
                  name: 'u2',
                  password: 'do not show me as well'
              }
          ],
          whereverLevel: {
              password: 'please, hide me too'
          }
      };
      
      // Use recursion.
      function updateDeeply(obj, key, value) {
          Object.keys(obj).forEach(function (_key) {
              // Note that Object.keys() works on arrays as well.
              if (_key === key) {
                  obj[_key] = value;
              } else if (typeof obj[_key] === 'object' || Array.isArray(obj[_key])) {
                  // Make recursive call.
                  updateDeeply(obj[_key], key, value);
              }
          });
      }
      
      updateDeeply(obj, 'password', 'replace');
      
      console.log(obj);
      

      【讨论】:

        猜你喜欢
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 2019-06-29
        • 1970-01-01
        • 2010-12-11
        • 2020-06-01
        • 2023-01-25
        • 2023-01-27
        相关资源
        最近更新 更多