2016-06-15 11 views
0

StackoverlFlowでこれについての解決策を見つけることができず、私は今この問題を少し前から取り組んできました。少し難しいので、もっと情報を提供する必要があるかどうか教えてください。Lodashで深くネストされたオブジェクトを返そうとしています

問題: 私は土地のJSONオブジェクトを持っていますが、各土地にIDとブロック配列が関連付けられており、そのブロック配列にはIDのブロックもあります。

プレビュー:

var Lands = [{ 
       'LandId':'123', 
       'something1':'qwerty', 
       'something2':'qwerty', 
       'Blocks': [ 
        { 
         'id':'456', 
         'LandId':'123' 
        }, 
        { 
         'BlockId':'789', 
         'LandId':'123' 
        } 
       ] 
      }, 
      ...More Land Objects]; 

:データはセットアップ私はそれを行っているだろうが、これは前の時間に沿って行われていたと私は今のために持っているものと仕事をしなければならない方法ではありません。

私はブロックアイランドを取ってそれらとマッチさせ、ブロックから土地を返すロダッシュ関数を書こうとしています。

最終結果は、ブロックから返されたLandIdのリストになります。

私はこのようなものを使用していたし、それは結果を返しませんでした:

selectedLand = function(Lands, landIDs){ 
       return _.filter(Lands, function(land){ 
        return land === landIDs[index]; 
       }); 
      }; 

私は、私はこのことについて間違った道を進んでいますし、これに近づくと、それを解決するための適切な方法を知りたいのですが知っています。どんな助けでも大歓迎です。 indexはこの範囲内の任意の定義を欠いので、この機能は、基本的に外部で定義されindexで幸運(?)事故がなければ、trueを返すことはありませんことを

答えて

2
selectedLand = function(Lands, landIDs){ 
       return _.filter(Lands, function(land){ 
        return land === landIDs[index]; 
       }); 
      }; 

注意。 _.filter(someArr,function(){return false;})に電話するといつでも[]になります。未定義indexさておき、これはあなたのニーズに合わせて、このフィルタを調整することができますので、私は、あなたの選択の正確な要件に少しは不明だlandIDs

で(多分)文字列に対する地形オブジェクトの厳密な比較を行います。 .blocks配列プロパティが.landID性がlandsIDアレイ内が含まれる一部値を持つかどうかをチェックすることによって機能フィルタlandsアレイ。

終了時に、lodash(または私のお気に入り、ramda.js)を最大限に活用したい場合は、座ってdocsを読むことをお勧めします。死ぬほど退屈だと思うが、データ変換との戦いの75%はあなたのツールボックスにあるものを知っている。プロセスの英語の記述が、サンプルコード(filter、some、includes)とほぼ正確に一致することに注意してください。

var Lands = [{ 
 
    'LandId': '123', 
 
    'something1': 'qwerty', 
 
    'something2': 'qwerty', 
 
    'Blocks': [{ 
 
     'id': '456', 
 
     'LandId': '123' 
 
    }, { 
 
     'BlockId': '789', 
 
     'LandId': '123' 
 
    }] 
 
    } 
 
]; 
 

 
// assuming lands is like the above example 
 
// and landIDs is an array of strings 
 
var selectLandsWithBlocks = function(lands, landIDs) { 
 
    return _.filter(lands, function(land) {  
 
    var blocks = land.Blocks; 
 
    var blockHasALandId = function(block) { 
 
     return _.includes(landIDs,block.LandId); 
 
    }; 
 
    return _.some(blocks, blockHasALandId); 
 
    }); 
 
}; 
 

 
console.log(selectLandsWithBlocks(Lands,[])); 
 
console.log(selectLandsWithBlocks(Lands,['mittens'])); 
 
console.log(selectLandsWithBlocks(Lands,['123']));
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/4.13.1/lodash.min.js"></script>

+0

これは素晴らしい例だったと私はlodashとramda.js間の本当の違いがどうなるか、今の文書を通じて自分の道を働いていますか? – Keeano

+1

@Keano彼らは同様の方法で使うことができます。 Lodashはより一般的であり、ヘルパー機能(例えば_camelCase)を持ち、すべてをカレーすることはできません(多少はあるがすべてではない)。 Ramdaは実用的な機能ライブラリなので、非常に簡単に関数をカリングしてパイプすることができます。 [こちらはramdaと同じソリューションです](https://jsbin.com/wopibiwidi/edit?js,console)。いくつかの定型文がありますが、 'R>をリストするのに沸騰します。フィルタ|> R.any |> R.contains '。 lodashと非常によく似ています(同じロジックなので)が、より複雑な変換で拡張する必要があるので、Ramdaは簡単になります。 – user01

+0

私はこの問題に巻き込まれていて、回避策を見つけられていません...あなたに電子メールを送ることができれば助けてくれますか?私はあなたが説明しているように、私はまだ奇妙なリターンを取得しているドキュメントを読んで...私はあなたのフィルタを使用して、少し別のものを得るためにそれを微調整しています。 – Keeano

関連する問題