2016-03-24 87 views
1

我需要從對象樹替換對象,我嘗試了幾種方法,但我不能替換對象樹中的對象

let data = [ 
    { 
     "accountId": 2 
    }, 
    { 
     "accountId": 6, 
     "children": [{ 
     "accountId": 8 
     }] 
    }, 
    { 
     "accountId": 45 
    } 
]; 

在上述對象數組我需要更換(當我知道accoundId

{ 
    "accountId": 2 
} 

{ 
    "accountId": 2, 
    "children": [ 
    { 
     "accountId": 85 
    } 
    ] 
} 

有什麼辦法(S)/庫(S)做到這一點。

+0

過得好了'children'?一些邏輯或硬編碼數據? – nikhil

+0

是的,它代表了子帳戶(子帳戶)api發送的那樣的數據對象 – TIJ

+0

不清楚。你怎麼得到85的價值? – nikhil

回答

2

普通的JavaScript,使用Array.prototype.map功能:

var data = [{ "accountId": 2 }, { "accountId": 6, "children": [{ "accountId": 8 }] }, { "accountId": 45 }]; 
 

 
var newData = { "accountId": 2, "children": [{ "accountId": 85 }] }; 
 

 
data = (function upd(data, n) { 
 
    return data.map(e => { 
 
     if (e.children) { 
 
      var o = {}; 
 
      o.accountId = e.accountId; 
 
      o.children = upd(e.children, n); 
 
      return o; 
 
     } 
 
     else if (e.accountId == 8) { 
 
      return n; 
 
     } else return e; 
 
    }); 
 
})(data, newData); 
 

 
document.write('<pre>' + JSON.stringify(data, 0, 2) + '</pre>');

+0

是的,但這不起作用如果我想替換子帳戶數組內的'accountId = 8'。 – TIJ

+0

@TIJ請參閱更新 – isvforall

1

可以使用迭代函數的搜索數組項的ID和更新。

function makeUpdate(a, u) { 
 
    return Array.isArray(a) && a.some(function (b,i,bb) { 
 
     if (b.accountId === u.accountId) { 
 
      bb[i] = u; 
 
      return true; 
 
     } 
 
     return makeUpdate(b.children, u); 
 
    }); 
 
} 
 

 
var data = [{ "accountId": 2 }, { "accountId": 6, "children": [{ "accountId": 8 }] }, { "accountId": 45 }], 
 
    update = { "accountId": 8, "children": [{ "accountId": 85 }] }; 
 

 
makeUpdate(data, update); 
 
document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>');