如何深入地映射对象

时间:2017-09-15 13:33:35

标签: javascript object

我想在我的所有对象值中更改某些内容,例如

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
]

4 个答案:

答案 0 :(得分:5)

要从另一个对象生成一个对象,人们会经常使用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回调中返回它,以便它通过整个过程。

这有时被称为" abusage" reduce的{​​{1}},因为累加器的永远不会改变(它总是相同的对象;对象的状态改变,但不是对象),而通常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));




答案 1 :(得分:0)

您可以递归地执行此操作:

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);

答案 2 :(得分:0)

更清洁的方式......

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;
};

答案 3 :(得分:-1)

Array.map函数返回Array ..这就是原因......如果你知道在对象里面要改变什么,为什么不直接这样做呢?

从我的观点来看,你正在做一些非常简单的冗余执行。

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

您正在使用Array.map从此数组创建另一个数组,并在其中创建(另一个)匿名函数以迭代新数组,然后在每次迭代你都会创建另外4个条件分支..