2016-08-24 1 views
0
var a = { 
    "errors":{ 
    "meters.electric":[ 
     {"smart_meter":["The smart meter field is required."],"reading":["The selected reading is invalid."]} 
    ], 
    "forename":[ 
     {"invalid_character":["Invalid character in forname.", "Blah blah."]} 
    ] 
    } 
}; 

APIからオブジェクトが返されているため、1つの文字列を作成するために最終値を抽出する必要があります。上記の意図した出力が可能owuld:混合オブジェクト/配列のリーフを抽出するためにロダッシュを使用する

The smart meter field is required. The selected reading is invalid.Invalid character in forname. Blah blah. 

私はこれを達成するための一連のループを構築することができます知っているが、lodash方法はありますか? https://lodash.com/docs#flattenDeepの行に沿った何か?

+1

あなたはより広範な例を与えることができますか?オブジェクトの他のプロパティとは何をしたいですか? .toStringを使い、プリミティブであるツリーのすべてのプロパティを連結したいですか?あるいは文字列であるものだけかもしれませんか? –

+0

私はオブジェクトにいくつかのセクションを追加し、その文を展開しました。 Bascially、はい、私はちょうどビューのためのエラー文字列がほしいと思うだけで最初にロダッシュで始まる.. – John

答えて

1

私はいくつかの構成的なロダッシュであなたを楽しませることができます。

文字列を連結する前に、おそらく、任意の複雑さのオブジェクト/配列から値を抽出できる汎用関数が必要です。ここでは、既存のlodashビルディング・ブロックを使用してこの機能を構成する可能性がある方法は次のとおりです。

const flattenCol = _.flow(
    _.identity, 
    _.partialRight(_.map, _.cond([ 
    [_.isArray, flattenCol], 
    [_.isPlainObject, flattenCol], 
    [_.stubTrue, _.identity], 
    ])), 
    _.flattenDeep 
); 

これは、このケースでは、あなたの構造から文字列をすべての値を抽出します。のは、このダウンを破るしてみましょう:identity()map()、およびflattenDeep()のうち、大きい方の機能を構成するために使用される

  • flow()
  • identity()は、1つの引数値がmap()に渡されることを保証するために使用されます。
  • partialRight()
  • map()
  • cond()に部分的に適用されるiteratee引数を有する関数を構成する渡された条件に基づいてマッピングされた値を返す関数を構成する。例えば、isArray()又はisPlainObject() trueを返した場合、それは再帰的に呼び出しますよflattenCol()。それ以外の場合は、stubTrue()がデフォルトです。値を返すだけです。
  • この時点では、値のネストされた配列構造があります。flattenDeep()は、これを単純な配列に平坦化します。

私は、このような機能をスーパーに役立てることがわかっています。あなたの文字列を構築するために、あなただけ行うことができます。

flattenCol(a).join(' '); 

それとも、あなたが行くの組成党を維持したい場合:

const errorString = _.flow(flattenCol, _.partialRight(_.join, ' ')); 
errorString(a); 
2

それは見て少しばかげだが、それは動作します:lodashとの比較のために

var flattenStrings = _.flatMap(_.flatMap(a.errors), function (i) { 
    return _.flatMap(i); 
}); 

_.join(flattenStrings, ' ') 

Example

+0

ヘクタールです。私はこのような何かがあることを知っていた、ありがとう! – John

1

、ここでバニラはJavaScriptを使用してのアプローチがあります:

var a = { 
    "errors":{ 
    "meters.electric":[ 
     {"smart_meter":["The smart meter field is required."],"reading":["The selected reading is invalid."]} 
    ], 
    "forename":[ 
     {"invalid_character":["Invalid character in forname.", "Blah blah."]} 
    ] 
    } 
}; 

function flattenStrings(obj) { 
    if (typeof obj != 'object') { 
    return obj.toString(); 
    } 
    return Object.keys(obj).map(function(key) { 
    return flattenStrings(obj[key]); 
    }).join(""); 
} 

console.log(flattenStrings(a)); 

なお、配列を処理することによって、および単純なオブジェクトであり、Object.keys()を使用すると、配列のインデックスが安定した順序でヒットすることは保証されないため、異なるブラウザ上の同じオブジェクト上でこれを実行すると、文字列の連結を異なる順序で行う可能性があります。

少し余分なコードで回避できますが、ここでは重要ではありませんでした。

+0

確かに、私は現時点で私の頭をロダッシュに入れようとしていますが、それは圧縮されたときに小さなライブラリーであり、長期的にはそれが価値があると思い始めています。 – John

+1

あなたがしたい場合は、ロダッシュ!私はちょうど個人的に文脈に役立つように2人を横に見ていることが分かるので、私は他の誰かがそうかもしれないと考えました。 –

関連する問題