2016-03-19 11 views
0

イム。 driversは空でもかまいませんが、常に存在します。私は右の場所で、このオブジェクトを配置する必要が再帰ループ

{ 
"name": "KIA", 
"drivers":[] 
} 

は今、私は以下の目的を持って言うことができます。私の助けに私は次のものを手に入れました。

McLaren/BMW/Subaru/saab 

したがって、新しいオブジェクトはLexusとHondaと同じ配列にプッシュされます。

私はそれを行う方法を見つけようと狂ってしまいました。私は次の行に考えています

私は配列へのパスを変換します。

var pathArr = ["McLaren","BMW","Subaru","saab"] 

そして、再帰関数を使用してみてください:

myFunction(newObject){ 

     for (var i = 0; i < pathArr.length; i++) { 
      recursiveFunc(data.drivers, pathArr[i]) 
     } 

     var recursiveFunc(driversArr, name) { 
      for (var ix = 0; ix < driversArr.length; ix++) { 
      if (driversArr[ix].name === name) {   
       recursiveFunc(driversArr[ix].drivers, "HERE I NEED pathArr[1]") 

      } 
      } 
     } 
     } 

を、私は非常に近い午前のように私は感じますいくつか欠けている部分があります。 多分、再帰について間違ったやり方を考えたり、過度に複雑にすることは考えていますか? 感謝していただきありがとうございます!

EDIT:

McLaren/BMW/Subaru/saabは、新しいオブジェクト(KIA)が行くべき場所へのパスを示しています。したがってKIAは、saabという名前のオブジェクトのdrivers -arrに入る必要があります。

recursiveFunc() はpath-nameがどの配列に存在するかをチェックし、パスの最後の部分(この場合はsaab)を見つけるためにこのオブジェクト配列を使用しようとします。新しいオブジェクトをこの配列にプッシュする必要があります。

+0

なぜ 'KIA'オブジェクトがSaab''にプッシュされますでしょうか?その関係を作るために何も示されていません。また、あなたの特定の問題や質問が何であるか明確ではありません。私は 'recursiveFunc()'が何をしているのかわかりません – charlietfl

+0

私はあなたが問題を理解しているかどうか分かりませんが、実際よりも複雑にしていると思います。 JavaScriptのJSONの基本について読むことをお勧めします。役立つかもしれません。 http://www.w3schools.com/js/js_json.asp – guicl

+0

再帰の終了条件を含む** else **ステートメントが必要です。 –

答えて

1

データを扱うのが難しい場合は、データを変換してください。

私は少し単純かもしれない代替ソリューションを提案:

をキーとして、あなたのパスを含むオブジェクト、および値として関連するドライバアレイへの参照を作成します。

var mapping = {}; 
function storeMap (chain, data) { 
    for (var i = 0; i < data.length; i++) { 
     var updatedChain = (chain && chain + '/') + data[i].name; 
     mapping[updatedChain] = data[i].drivers; 
     if (data[i].drivers.length) { 
      storeMap (updatedChain, data[i].drivers); 
     } 
    } 
} 

storeMap('', [data]); 

その後、あなたの項目を追加する:

var itemToAdd = { "name": "KIA", "drivers":[] }; 
var path = 'McLaren/BMW/Subaru/saab'; 
mapping[path].push(itemToAdd); 

これは、一度オフであることを意味していました...再利用性の場合:毎回のマップを効率よく実行する必要があります。あなたができることは、地図を変更するときに地図を更新するメソッドを持つことです:

function addItem (item) { 
    mapping[path].push(item); 
    mapping[path + '/' + item.name] = item.drivers; 
} 

function removeItem (item) { 
    var parentPath = item.name.split('/').slice(0, -1).join('/'); 
    var drivers = mapping[parentPath].drivers; 
    drivers.splice(drivers.indexOf(item), 1); 
    delete mapping[item.name]; 
} 
+0

これはすばらしい答えでした。 最初に私はそれが何をしたのか分からなかったが、コンソールに "マッピング"を記録した後、それはより明確になった。より良いマッピングの概念をよりよく理解するためのコードを勉強します。また、再利用可能な拡張機能に感謝します。 – user2915962

1

{ drivers : [data] }ルートオブジェクトをcurrentNodeとして渡すこのコードを実行できます。

var insert = function(currentNode, nodeToInsert, pathArr) { 
    if(pathArr.length == 0) { 
     currentNode.drivers.push(nodeToInsert); 
     return true; 
    } 
    for(var i = 0; i < currentNode.drivers.length; i++) 
     if(currentNode.drivers[i].name == pathArr[0]) 
      return insert(currentNode.drivers[i], nodeToInsert, pathArr.splice(1)); 
    return false; 
} 

あなたの例では、あなたがパスサーチ失敗をリードするパスでJSONでSaabsaabを持っていることに注意してください。

+0

ありがとうございました!このコードで動作させることができるかどうかがわかります! – user2915962

+0

@ user2915962、コード実行中に問題が発生した場合はお知らせください。 –

+0

{ドライバ:[データ]}ルートオブジェクトをcurrentNodeとして渡してみました。出来た! どの回答が「最高」であるのかわかりませんが、私はそれからもっと学んだという事実のために上記の答えを受け入れることに決めました。 私はあなたが時間を取ったことを感謝します、ありがとう! – user2915962

1

オブジェクトとパスを配列として受け取るもう1つのソリューションです。

function find(object, path) { 
 
    if (object.name.toLowerCase !== path.shift().toLowerCase) { 
 
     return; 
 
    } 
 
    return (!path.length || object.drivers.some(function (a) { 
 
     object = find(a, path.slice()); 
 
     return object; 
 
    })) && object; 
 
} 
 

 
var data = { "name": "McLaren", "drivers": [{ "name": "BMW", "drivers": [{ "name": "VW", "drivers": [] }, { "name": "Subaru", "drivers": [{ "name": "Saab", "drivers": [{ "name": "Lexus", "drivers": [] }, { "name": "Honda", "drivers": [] }] }] }] }] }, 
 
    path = 'McLaren/BMW/Subaru/Saab', 
 
    object = { "name": "KIA", "drivers": [] }; 
 

 
find(data, path.split('/')).drivers.push(object); 
 
document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>');