を挿入アップデートJavaScriptオブジェクト、ネストされたデータ - のiは、以下のデータを持っていると言うだけではない場合、更新
scores
と
sites
は
scores
で
id
をもとに独自の要素を持つ配列を含み、
sites
に
sid
に基づいていることに注意してください
var obj = {
test: 'somedata',
scores: [
{
"points":99,
"id":"x12"
},
{
"points":21,
"id":"x13"
}
],
sites: [
{
"exercises":21,
"sid":"s12"
},
{
"exercises":23,
"sid":"s11"
}
],
history: {
key: 'value',
commits: [
{
id: 1,
value: 'thank you'
}
]
}
}
。私は、次の魔法行う関数たい:
//will **update** obj.test to 'newdata' and return {test:'newdata'}
magicUpdate(obj, {test:'newdata'})
//will **insert** obj.newkey with with value 'value' and return {newkey: 'value'}
magicUpdate(obj, {newkey: 'value'})
//will do nothing and return {}
magicUpdate(obj, {scores: []})
//will **update** scores[0] and return {scores:[{points:3, id: "x12"}]}, as id "x12" is already in the array at index 0
magicUpdate(obj, {scores:[{points:3, id: "x12"}])
//will **insert** {points:3, id: "x14"} into obj.scores and return {scores:[{points:3, id: "x14"}]}
magicUpdate(obj, {scores:[{points:3, id: "x14"}]})
//will **update** sites[0] and return {sites:[{exercises:22, sid: "s12"}]}, as id "s12" is already in the array at index 0
magicUpdate(obj, {sites:[{exercises:22, sid: "s12"}])
//will **insert** {exercises:10, sid: "s14"} into obj.sites and return {sites:[{exercises:10, sid: "s14"}]}
magicUpdate(obj, {sites:[{exercises:10, sid: "s14"}]})
//and also be recursive ...
//will **update** obj.history.commits[0]
magicUpdate(obj, {'history.commits': [{id:1, value: 'changed'}]});
を私は再帰をやって.updateを見てきましたが、一つは自動的に決定されなければならないpath
を通過している場合にのみ。その後、内部で_.baseMergeを使用する.mergeがあり、私は機能のシグネチャを理解していませんが、私が必要とするものに本当に近い状態になります。
_.merge(
{scores:[{id: 12, points:10}, {id: 13, points:10}]},
{scores:[{id: 14, points:10}, {id: 15, points:10}]}
)
// returns {scores:[{id: 14, points:10}, {id: 15, points:10}]} not the fully merged array
誰かがいい方向に向けることができますか、またはロダッシュと同様のことを達成できますか?
これまで何を試みましたか? –
私は再帰が必要であることに気がついたときに良くなかった自分自身の関数を書こうとしました。私は上記のロダッシュの機能を見つけ、誰かが以前に同じ問題を抱えている可能性があると考えました。 – niklas
オブジェクトとネストされたオブジェクトが完全に連携していることに気付きました。たぶん私は自分のデータ構造を '{id:s1、points:2}、...]'から 'score:{s1:{points:2}、...}'に変換しようとします。 – niklas