2017-09-15 171 views
1

我想改变的财产以后在我的对象的所有值,让说,例如如何映射对象深入

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 
] 
+1

'map'在数组上工作并返回另一个数组。在你的案例中工作在一个键数组上,并返回一个数组(和/或子阵列)。 –

+0

所以我怎么能实现我的输出 – Ash

+0

也许检查这个:https://stackoverflow.com/questions/25333918/js-deep-map-function? – Guntram

回答

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回调每次返回它。

这有时被称为一个的reduce“abusage”,因为累加器的从不改变(它总是相同的对象;对象的状态变化,但不是对象),而通常的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));

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

Array.map功能返回Array..this是原因......如果你知道在对象内部需要更改什么,为什么不直接执行?

从我的角度来看,你正在为一些非常简单的事情做冗余执行。

你要创建一个匿名函数,使用Object.keys得到一个新的数组(后迭代你的对象)

你使用Array.map创建此数组另一个阵列和内它创建(另一)匿名函数迭代的新数组,并在每次迭代要创建另外4个条件分支..

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