簡體   English   中英

如何深層映射對象

[英]How to MAP an Object Deeply

我想改變我的所有對象值,比如說

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
]

為了從另一個對象生成一個對象,人們將經常使用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 ,由於累加器的不會改變(它總是相同的對象;對象的狀態變化,但不是對象),而正常情況下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)); 

您可以遞歸執行:

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

更干凈的方式...

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

Array.map函數返回Array ..這就是原因...如果您知道對象內部要更改的內容,為什么不直接這樣做呢?

從我的角度來看,您正在為一些非常簡單的事情執行冗余執行。

您正在創建一個匿名函數,使用Object.keys獲取一個新數組(在迭代您的對象之后)

您正在使用Array.map從該數組創建另一個數組,並在其內部創建( 另一個 )匿名函數來迭代新數組,並在每次迭代中創建另外4個條件分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM