【问题标题】:javascript filter by key and map the value of the key onto the new object key from another objectjavascript 按键过滤并将键的值映射到另一个对象的新对象键
【发布时间】:2018-03-03 17:36:17
【问题描述】:

我通过根据一些允许的键过滤键来构造一个对象:

const configObject = { 
  key1: 'value1', key2: 'value2', key3: 'value3', key4: 'value4'
};
const allowed = ['key1', 'key3'];

const filtered = Object.keys(configObject)
  .filter(key => allowed.includes(key))
  .reduce((obj, key) => {
    obj[key] = configObject[key];
    return obj;
  }, {});

console.log(filtered) // { key1: 'value1', key3: 'value3' }

但是,我想从一个键/值配对对象中获取新对象的键,键名很好:

const allowed = [{'key1': 'keyOne'}, {'key3': 'keyThree'}];

我怎样才能做到这一点以获得以下结果:

 { keyOne: 'value1', keyThree: 'value3' }

【问题讨论】:

    标签: javascript arrays object ecmascript-6


    【解决方案1】:

    您可以获取键对象的条目并映射新属性。

    var configObject = { key1: 'value1', key2: 'value2', key3: 'value3', key4: 'value4' },
        allowed = [{'key1': 'keyOne'}, {'key3': 'keyThree'}],
        filtered = Object.assign(
            ...allowed.map(o => 
                Object.assign(...Object.entries(o).map(([o, n]) =>
                    ({ [n]: configObject[o] })))
            )
        );
    
    console.log(filtered);

    使用减少

    var configObject = { key1: 'value1', key2: 'value2', key3: 'value3', key4: 'value4' },
        allowed = [{'key1': 'keyOne'}, {'key3': 'keyThree'}],
        filtered = allowed.reduce((r, o) => {
            Object.entries(o).forEach(([o, n]) => r[n] = configObject[o]);
            return r;
        }, {});
    
    console.log(filtered);

    【讨论】:

    • 不错的一个!你能用非扩展语法替换扩展语法吗?谢谢
    【解决方案2】:

    您可以将allowed 用作字典,而不仅仅是一个列表:

    const configObject = {
      key1: 'value1',
      key2: 'value2',
      key3: 'value3',
      key4: 'value4'
    };
    const allowed = {'key1': 'keyOne', 'key3': 'keyThree'};
    const filtered = Object.keys(configObject)
      .filter(key => Object.keys(allowed).includes(key))
      .reduce((obj, key) => {
        obj[allowed[key]] = configObject[key];
        return obj;
      }, {});
    
    console.log(filtered) // "keyOne": "value1", "keyThree": "value3" }

    【讨论】:

      【解决方案3】:

      您可以使用Array.reduce() 来迭代allowed 数组,并根据configObject 上存在的键构建新对象:

      const configObject = { key1: 'value1', key2: 'value2', key3: 'value3', key4: 'value4' };
      const allowed = [{'key1': 'keyOne'}, {'key3': 'keyThree'}, 'key2', 'key5']; // I've added key2 as string, and the non existing key5
      
      const result = allowed.reduce((r, o) => {
        // get the key and alias from an object or string
        const [key, alias] = typeof o === 'object' ? Object.entries(o)[0] : [o, o];
        
        if(key in configObject) { // if key exists in configObject
          r[alias] = configObject[key]; // assign it to r;
        }
        
        return r;
      }, {});
      
      console.log(result);

      【讨论】:

        【解决方案4】:

        只需更改对象的允许数组并使用相同的逻辑

        const configObject = { 
          key1: 'value1', 
          key2: 'value2', 
          key3: 'value3', 
          key4: 'value4'
        };
        
        const allowed = {
          key1: 'keyOne',
          key3: 'keyThree'
        };
        const allowedKeys = Object.keys(allowed)
        
        const filtered = Object.keys(configObject)
          .filter(key => allowedKeys.includes(key))
          .reduce((obj, key) => {
            obj[allowed[key]] = configObject[key];
            return obj;
          }, {});
        
        console.log(filtered) 

        【讨论】:

          【解决方案5】:

          如果您只想从特定数字中获取漂亮的名称,请使用正则表达式:

          /([a-z]+)(\d+)/i
          

          这适用于keywhatever1111key1anotherkey2 等任何键。

          var prettyOnes = {
            '1': 'One',
            '2': 'Two',
            '3': 'Three',
            '11': 'Eleven'
          };
          
          const configObject = { 
            key1: 'value1', key2: 'value2', key3: 'value3', whatever11: 'value11'
          };
          const allowed = ['key1', 'key3', 'whatever11'];
          
          const filtered = Object.keys(configObject)
            .filter(key => allowed.includes(key))
            .reduce((obj, key) => {
              var [_, pre, pretty] = key.match(/([a-z]+)(\d+)/i);
              obj[`${pre}${prettyOnes[pretty]}`] = configObject[key];
              return obj;
            }, {});
          
          console.log(filtered);
          .as-console-wrapper { max-height: 100% !important; top: 0; }

          【讨论】:

            猜你喜欢
            • 2020-06-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-11
            • 1970-01-01
            • 1970-01-01
            • 2023-02-05
            相关资源
            最近更新 更多