代码之家  ›  专栏  ›  技术社区  ›  The pyramid

在忽略某些键的同时,如何转换对象中的某些值?

  •  1
  • The pyramid  · 技术社区  · 6 年前

    我想循环使用不同键的数组中的对象,而不使用for each循环:

       [ { id: 1,
        ip: 'xx.xxx.xx.xx',
        mn1: '',
        mn2: '',
        mn3: '',
        mn4: '',
        mn5: '',
        mn6: '',
        mn7: '' },
      { id: 2,
        ip: 'xxx.xxx.xx.xx',
        mn1: '',
        mn2: '',
        mn3: '',
        mn4: '',
        mn5: '',
        mn6: '',
        mn7: '' },
      { id: 4,
        ip: 'xxx.xxx.xx.xxx',
        mn1: '',
        mn2: '',
        mn3: '',
        mn4: '',
        mn5: '',
        mn6: '',
        mn7: '' } ]
    

    我想检查每一列mn的长度值,然后用一些信息更新它,如果还有其他条件,我可以这样做,但我认为有更好的方法可以这样做。我试过用 Object.entries 然后是for循环,但由于id和ip列的原因,它无法工作。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Dacre Denny    6 年前

    也许这样的东西对你有用?此解决方案对您的问题采用功能性方法,并避免明确使用 for-loop 构建:

    var input = [ { id: 1,
        ip: 'xx.xxx.xx.xx',
        mn1: '',
        mn2: '',
        mn3: '',
        mn4: '',
        mn5: '',
        mn6: '',
        mn7: '' },
      { id: 2,
        ip: 'xxx.xxx.xx.xx',
        mn1: '',
        mn2: '',
        mn3: '',
        mn4: '',
        mn5: '',
        mn6: '',
        mn7: '' },
      { id: 4,
        ip: 'xxx.xxx.xx.xxx',
        mn1: '',
        mn2: '',
        mn3: '',
        mn4: '',
        mn5: '',
        mn6: '',
        mn7: '' } ];
        
    var output = input.map(object => {
      
      return Object.entries(object).reduce((result, entry) => {
        
        let key = entry[0];
        let value = entry[1];
        
        if(key.startsWith('mn')) {
          
         value = `updated value for ${ key }`;
        }    
        
        result[key] = value;
        return result;
        
      }, {});
    });
    
    console.log(output);
        2
  •  1
  •   Rico Kahler    6 年前

    您可以在修改键之前检查它的名称。

    这有帮助吗?通过运行代码段来尝试。

    const arr = [{
        id: 1,
        ip: 'xx.xxx.xx.xx',
        mn1: '',
        mn2: '',
        mn3: '',
        mn4: '',
        mn5: '',
        mn6: '',
        mn7: ''
      },
      {
        id: 2,
        ip: 'xxx.xxx.xx.xx',
        mn1: '',
        mn2: '',
        mn3: '',
        mn4: '',
        mn5: '',
        mn6: '',
        mn7: ''
      },
      {
        id: 4,
        ip: 'xxx.xxx.xx.xxx',
        mn1: '',
        mn2: '',
        mn3: '',
        mn4: '',
        mn5: '',
        mn6: '',
        mn7: ''
      }
    ];
    
    console.log('BEFORE', JSON.stringify(arr, null, 2));
    
    for (const item of arr) {
      for (const key of Object.keys(item)) {
        if (!key.startsWith('mn')) continue;
        
        // know if the code gets here then it's an `mn` key
        
        // you can do logic here on the key
        // and then manipulate the result
        
        item[key] = 'changed';
      }
    }
    
    console.log('AFTER', arr);
        3
  •  1
  •   Michael Hines    6 年前

    你可以使用 Object.entries , Array.prototype.filter ,和 Array.prototype.forEach 对你有利。

    const transform = value => `transformed-${value}`;
    const arr = [{ id: "id", ip: "ip", otherKey: "other" }];
    arr.forEach(obj => {
        Object.entries(obj)
            .filter(([key]) => key !== "id" && key !== "ip")
            .forEach(([key, value]) => (obj[key] = transform(value)));
    });
    console.log(arr)

    如果您不能使用最新的ecmascript功能,这将变得冗长,但是:

    var transform = function(value) { return "transformed-" + value };
    var arr = [{ id: "id", ip: "ip", otherKey: "other" }];
    arr.forEach(function(obj) {
        Object.entries(obj)
            .filter(function(keyValue) {
                var key = keyValue[0];
                return key !== "id" && key !== "ip";
            })
            .forEach(function(keyValue) {
                var key = keyValue[0],
                    value = keyValue[1];
                obj[key] = transform(value);
            });
    });
    console.log(arr)

    如果你陷入了一个没有巴别塔的项目,你最好的选择可能是你最初的建议。

    var transform = function(value) { return "transformed-" + value };
    var arr = [{ id: "id", ip: "ip", otherKey: "other" }];
    arr.forEach(function(obj) {
        Object.entries(obj).forEach(function(keyValue) {
            var key = keyValue[0],
                value = keyValue[1];
            if (key !== "id" && key !== "ip") {
                obj[key] = transform(value);
            }
        });
    });
    console.log(arr)