2017-09-15 179 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; 
};