2016-03-24 85 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>');