2016-03-24 9 views
1

でオブジェクトを交換し、私はいくつかの方法を試してみましたが、私はaccoundIdを知ったとき、私は上記のオブジェクト配列で私はオブジェクトツリー内からオブジェクトを交換する必要があるオブジェクトツリー

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

できなかった私は(交換する必要があります

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

へ)

{ 
    "accountId": 2 
} 

それを行うには(S)/ライブラリ(s)はどのような方法があります。 Array.prototype.map機能を使用して

+0

どのようにあなたが 'children'を得ていますか?いくつかのロジックまたはハードコードされたデータ? – nikhil

+0

はい、その子供のアカウント(サブアカウント)を表すそのようなデータオブジェクトを送信する – TIJ

+0

明確ではありません。あなたはどのように価値85を得ていますか? – nikhil

答えて

2

プレーンジャバスクリプト、:

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

関連する問題