【问题标题】:How to MAP an Object Deeply如何深度映射对象
【发布时间】:2017-09-15 13:33:35
【问题描述】:

我想在我的所有对象值中更改一些东西,比如说

var a = {a:{c:1},b:2};
desire output :  a = {a:{c:5},b:10} //multiply by 5

我就是这样的

 var m = function n (o){
    return Object.keys(o).map(function(v,i){
        if(o[v] !== null && typeof o[v] === 'object') return n(o[v])
        else return (o[v]*5);
    })
    }

a = m({a:{c:1},b:2})

但是得到一个

的输出
[
  [
    5
  ],
  10
]

【问题讨论】:

  • map 作用于一个数组并返回另一个数组。在您的情况下,处理一个键数组并返回一个数字数组(和/或子数组)。
  • 那么我怎样才能实现我的输出
  • 我已经检查过了,但无法获得欲望输出@Guntram

标签: javascript object


【解决方案1】:

为了从另一个对象生成一个对象,人们会经常使用reduce

var a = {a: {c: 1}, b: 2};

var m = function n(o) {
    return Object.keys(o).reduce(function(newObj, key) {
        var value = o[key];
        if (value !== null && typeof value === 'object') {
          newObj[key] = n(value);
        } else {
          newObj[key] = value * 5;
        }
        return newObj;
    }, {});
};
console.log(m(a));

我们传入一个新对象作为“累加器”并在其上设置属性,每次都从reduce回调中返回它,以便它通过整个过程。

这有时被称为reduce 的“滥用”,因为累加器的 永远不会改变(它始终是同一个对象;对象的状态会改变,但对象不会改变),而通常reduce 回调会改变通过它的值。

如果您愿意,forEach 关闭新对象是另一种常见的方式:

var a = {a: {c: 1}, b: 2};

var m = function n(o) {
    var newObj = {};
    Object.keys(o).forEach(function(key) {
        var value = o[key];
        if (value !== null && typeof value === 'object') {
          newObj[key] = n(value);
        } else {
          newObj[key] = value * 5;
        }
    });
    return newObj;
};
console.log(m(a));

【讨论】:

    【解决方案2】:

    你可以递归地做:

    var myObj = {a:{c:1},b:2};
    
    function changeChild(obj) {
        var keys = Object.keys(obj);
        keys.forEach(key => {
            if (typeof obj[key] === "object") {
                changeChild(obj[key])
            } else if (typeof obj[key] === "number") {
                obj[key] = obj[key] * 5;
            }
        });
    }
    
    changeChild(myObj);
    
    console.log(myObj);
    

    【讨论】:

      【解决方案3】:

      更清洁的方式...

      var m = function (object) {
          for(var key in object) {
              if(!!object[key] && typeof object[key] === 'object') {
                  object[key] = m(object[key]);
              } else {
                  object[key] *= 5;
              }
          }
          return object;
      };
      

      【讨论】:

        【解决方案4】:

        Array.map 函数返回 Array..这就是原因...如果您知道要在对象内部更改什么,为什么不直接做呢?

        在我看来,您正在为一些非常简单的事情执行冗余执行。

        您正在创建一个匿名函数,使用 Object.keys 获取一个新数组(在它迭代您的对象之后)

        您正在使用 Array.map 从该数组创建 another 数组,并在其中创建 (another) 匿名函数来迭代新数组,并在每次迭代时您正在创建另外 4 个条件分支..

        【讨论】:

          猜你喜欢
          • 2016-05-05
          • 1970-01-01
          • 2023-03-28
          • 2012-03-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-12-19
          • 2016-02-03
          相关资源
          最近更新 更多