【问题标题】:Rename some keys in an object重命名对象中的某些键
【发布时间】:2020-06-24 16:39:47
【问题描述】:

我有一个包含多个键和值的对象。

我只想重命名一些键而不是全部。就我所做的而言,它不会返回对象中的其余键值对:

data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"}; 

keyMap = {key1: "firstkey", key2: "secondkey"};

mappedData = Object.keys(keyMap).reduce((obj,k) => Object.assign(obj, { [keyMap[k]]: data[k] }),{});

console.log(mappedData);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

我如何返回:

{
  firstkey: "value1",
  secondkey: "value2",
  key3: "value3", 
  key4: "value4"
}

【问题讨论】:

    标签: javascript jquery object ecmascript-6 key-value


    【解决方案1】:

    您可以通过检查keyMap 获取条目并替换密钥,然后获取新密钥或使用旧密钥。

    let data =  { key1: "value1", key2: "value2", key3: "value3", key4: "value4" }; 
        keyMap = { key1: "firstkey", key2: "secondkey" },
        mappedData = Object.fromEntries(
            Object
                .entries(data)
                .map(([key, value]) => [key in keyMap ? keyMap[key] : key, value])
        );
    
    console.log(mappedData);

    【讨论】:

      【解决方案2】:

      大概是这样的:

      const changeKeys = (keyMap) => (obj) =>
        Object .fromEntries (Object .entries (obj) .map (([k, v]) => [keyMap[k] || k, v]))
      
      const data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"}; 
      const keyMap = {key1: "firstkey", key2: "secondkey"};
      
      console .log(
        changeKeys (keyMap) (data)
      )

      Object.entriesObject.fromEntriesmap 或其他转换一起使用可以解决各种对象操作问题。

      如果您的环境中 Object.fromEntriesnot available,则很容易填充。

      【讨论】:

      • 如果您需要将键映射到空字符串,Nina 使用 in 会更好。
      【解决方案3】:

      这是您的代码,稍作更新:

      data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"}; 
      
      keyMap = {key1: "firstkey", key2: "secondkey"};
      
      mappedData = Object.keys(data).reduce((obj,k) => Object.assign(obj, { [keyMap[k] || k]: data[k] }),{});
      
      console.log(mappedData);
      

      【讨论】:

        【解决方案4】:

        你可以用for循环一次性完成

        data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"}; 
        
        keyMap = {key1: "firstkey", key2: "secondkey"};
        
        const isDefined = x => typeof x !== 'undefined'
        
        const renameKeys = o => {
          const newObj = {}
          for (const key in o) {
            if (isDefined(keyMap[key])) {
              newObj[keyMap[key]] = o[key]
            } else {
              newObj[key] = o[key]
            }
          }
          return newObj
        }
        
        console.log(
          renameKeys(data)
        )

        【讨论】:

          【解决方案5】:

          我会遍历数据并查看是否存在密钥。如果它确实使用它,如果不使用原始密钥。

          var data = {
            key1: "value1",
            key2: "value2",
            key3: "value3",
            key4: "value4"
          };
          
          var keyMap = {
            key1: "firstkey",
            key2: "secondkey"
          };
          
          
          const updated = Object.entries(data).reduce((obj, [key, value]) => {
            const updatedKey = keyMap[key] || key
            obj[updatedKey] = value
            return obj
          }, {})
          
          console.log(updated);

          【讨论】:

            【解决方案6】:

            问题在于reduce 函数中的累加器是一个新的空对象,而您只是在迭代要更改的键。

            有很多方法可以做你想做的事。我个人觉得 reduce 难以解析,所以我会跳过它并做这样的事情:

            const data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"}; 
            
            const keyMap = {key1: "firstkey", key2: "secondkey"};
            
            const mappedData = {};
            for(const key of Object.keys(data)){
              // Use the renamed key if it exists, else fall back on the original key
              mappedData[ keyMap[key] || key ] = data[ key ];
            }
            
            console.log(mappedData);
            

            如果您真的想这样做,可以通过迭代原始数据而不是键映射来对 reduce 应用相同类型的逻辑:

            const data = {key1: "value1", key2: "value2", key3: "value3", key4: "value4"}; 
            
            const keyMap = {key1: "firstkey", key2: "secondkey"};
            
            mappedData = Object.keys(data).reduce((obj,k) => Object.assign(obj, { [keyMap[k] || k]: data[k] }),{});
            
            console.log(mappedData);
            
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-10-14
              • 2011-06-06
              • 1970-01-01
              • 2016-09-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多